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_ivalue.c,v $
37 * Date : $Date: 2007/02/15 01:55:50 $
38 * Version : $Revision: 1.2 $
39 * CVS Id : $Id: wdgtsGtk_tw_ivalue.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_ivalue.c
47 * @brief Define and create GTK integer entry field and its associated callbacks.
48 *
49 * Functions to create a GTK integer 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 an integer entry field in GTK is just a text
52 * entry field, but TINA handles it differently.
53 * tw_ivalue differs from tw_iglobal in that the latter uses a pointer to locate the global
54 * data whereas the former uses setter and getter functions. Both forms are used in the Xv
55 * Tina and both are retained to maximise cross-compatibility in the Gtk Tina.
56 *
57 * Note that the functions in this file are duplicated for each widget set (xv, GTK, xm, etc ...).
58 *
59 */
60
61 #include "wdgtsGtk_tw_ivalue.h"
62
63 #if HAVE_CONFIG_H
64 # include <config.h>
65 #endif
66
67 #include <stdio.h>
68 #include <gtk/gtk.h>
69 #include <tinatool/wdgts/gtk2/wdgts_GtkDef.h>
70 #include <tinatool/wdgts/gtk2/wdgtsGtk_tw_command.h>
71 #include <tinatool/wdgts/gtk2/wdgtsGtk_tw_tool.h>
72
73
74 /**
75 * @brief Copy integer from entry widget to stored callback data field.
76 * @param twc Pointer to Tw_callback associated with this integer entry widget.
77 *
78 * Callback function for integer entry widgets. Each of these has an associated
79 * Tw_callback, and this function uses a setter function stored in the data field
80 * of the Tw_callback to copy the current widget integer to the desired variable.
81 *
82 * Note that this callback is not invoked directly by the widget, but via a call
83 * to tw_text_callback (in wdgtsGtk_tw_command.c).
84 */
85 static void ivalue_call(Tw_callback * twc)
86 {
87 int x;
88 void (*set)() = (void (*) ()) twc->data2;
89 char *string = (char *) gtk_entry_get_text(GTK_ENTRY(twc->widget));
90
91 if (sscanf(string, "%d", &x) == 1)
92 (*set) (x);
93 }
94
95 /**
96 * @brief Replay integer entry from current macro file.
97 * @param twc Pointer to Tw_callback associated with this widget.
98 * @param args Pointer to required data, stored in the macro file.
99 *
100 */
101 static void ivalue_cmnd(Tw_callback * twc, char *args)
102 {
103 int x;
104 void (*set)() = (void (*) ()) twc->data2;
105 char string[64];
106
107 (void) sscanf(args, "%*s %d", &x);
108 (*set) (x);
109 (void) sscanf(args, "%*s %s", string);
110 gtk_entry_set_text(GTK_ENTRY(twc->widget), string);
111 }
112
113 /**
114 * @brief Record integer entry in current macro file.
115 * @param fp Pointer to current macro file.
116 * @param twc Pointer to Tw_callback associated with this widget.
117 *
118 */
119 static void ivalue_prnt(FILE * fp, Tw_callback * twc)
120 {
121 int (*get)() = (int (*) ()) twc->data1;
122
123 (void) fprintf(fp, "%s %d\n", twc->name, (*get)());
124 }
125
126
127 /**
128 * @brief Create new integer entry field and its associated callback struct.
129 * @param name String to be used as entry field identifier and label.
130 * @param get() Pointer to getter function for integer entered in the field.
131 * @param set() Pointer to setter function for integer entered in the field.
132 * @param nchars Maximum number of characters for input field.
133 * @return Tw_callback Pointer to new Tw_callback associated with this entry field.
134 *
135 * Creates new hbox for integer entry field, and packs field and label in it.
136 *
137 * Invokes callback for each keypress, via call to tw_text_callback
138 * (in wdgtsGtk_tw_command.c).
139 *
140 */
141 Tw_callback *tw_ivalue(char *name, int (*get)(), void (*set)(), int nchars)
142 {
143 GtkWidget *panel= tw_get_panel();
144 GtkWidget *box;
145 GtkWidget *itxlabel;
146 GtkWidget *itxentry;
147
148 char string[32];
149
150 Tw_callback *twc;
151 char *fullname = tw_extend_fullname(tw_get_toolname(), name);
152
153 box = gtk_hbox_new(FALSE, 8);
154 gtk_container_add(GTK_CONTAINER(panel), box);
155 gtk_widget_show(box);
156
157 itxlabel = gtk_label_new(name);
158 itxentry = gtk_entry_new();
159 gtk_widget_set_usize(itxentry, (10+6*nchars), 22);
160 gtk_box_pack_start(GTK_BOX(box), itxlabel, FALSE, FALSE, 0);
161 gtk_box_pack_start(GTK_BOX(box), itxentry, FALSE, FALSE, 0);
162 gtk_widget_show(itxlabel);
163 gtk_widget_show(itxentry);
164
165 (void) sprintf(string, "%d", (*get) ());
166 gtk_entry_set_text(GTK_ENTRY(itxentry), string);
167
168 twc = tw_callback_make(fullname, itxentry,
169 ivalue_call, ivalue_cmnd, ivalue_prnt, (void (*) ()) NULL,
170 (void *) get, (void *) set);
171
172 /* Invoke callback for GTK entry "changed" event (i.e. for each keypress) */
173 gtk_signal_connect(GTK_OBJECT(itxentry), "changed",
174 GTK_SIGNAL_FUNC(tw_gtk_callback),
175 (gpointer) twc);
176
177 return (twc);
178 }
179
180 /**
181 * @brief Reset integer entry field when value has been altered in the program.
182 * @param twc Pointer to Tw_callback associated with this text entry widget.
183 *
184 * NOTE: NOT TESTED YET - GAB 10 Oct 2003.
185 *
186 */
187 void tw_ivalue_reset(Tw_callback * twc)
188 {
189 int (*get)();
190 char string[64];
191
192 if (twc == NULL)
193 return;
194
195 get = (int (*)()) twc->data1;
196 (void) sprintf(string, "%d", get());
197 gtk_entry_set_text(GTK_ENTRY(twc->widget), string);
198 }
199
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.