71
72
/****************************************************************************/
75
cb_so_get_ref (GnmDependent *dep, SheetObject *so, gpointer user)
77
GnmDependent **pdep = user;
82
so_get_ref (SheetObject const *so, GnmCellRef *res, gboolean force_sheet)
85
GnmDependent *dep = NULL;
87
g_return_val_if_fail (so != NULL, NULL);
89
/* Let's hope there's just one. */
90
sheet_object_foreach_dep ((SheetObject*)so, cb_so_get_ref, &dep);
91
g_return_val_if_fail (dep, NULL);
93
if (dep->texpr == NULL)
96
target = gnm_expr_top_get_range (dep->texpr);
100
*res = target->v_range.cell.a;
101
value_release (target);
103
if (force_sheet && res->sheet == NULL)
104
res->sheet = sheet_object_get_sheet (so);
109
cb_so_clear_sheet (GnmDependent *dep, SheetObject *so, gpointer user)
111
if (dependent_is_linked (dep))
112
dependent_unlink (dep);
117
so_clear_sheet (SheetObject *so)
119
/* Note: This implements sheet_object_clear_sheet. */
120
sheet_object_foreach_dep (so, cb_so_clear_sheet, NULL);
74
126
so_widget_view_destroy (SheetObjectView *sov)
76
128
gtk_object_destroy (GTK_OBJECT (sov));
79
131
so_widget_view_set_bounds (SheetObjectView *sov, double const *coords, gboolean visible)
81
133
FooCanvasItem *view = FOO_CANVAS_ITEM (sov);
134
double left = MIN (coords [0], coords [2]);
135
double top = MIN (coords [1], coords [3]);
136
double width = fabs (coords [2] - coords [0]) + 1.;
137
double height = fabs (coords [3] - coords [1]) + 1.;
139
/* We only need the next check for frames, but it doesn't hurt otherwise. */
83
144
/* NOTE : far point is EXCLUDED so we add 1 */
84
145
foo_canvas_item_set (view,
85
"x", MIN (coords [0], coords [2]),
86
"y", MIN (coords [1], coords [3]),
87
"width", fabs (coords [2] - coords [0]) + 1.,
88
"height", fabs (coords [3] - coords [1]) + 1.,
90
151
foo_canvas_item_show (view);
142
203
GSF_CLASS (SheetWidget ## n2, sheet_widget_ ## n1, \
143
204
&sheet_widget_ ## n1 ## _class_init, \
144
205
&sheet_widget_ ## n1 ## _init, \
145
SHEET_OBJECT_WIDGET_TYPE);
206
SHEET_OBJECT_WIDGET_TYPE)
147
208
typedef SheetObject SheetObjectWidget;
156
217
static GType sheet_object_widget_get_type (void);
159
sax_write_dep (GsfXMLOut *output, GnmDependent const *dep, char const *id)
220
sax_write_dep (GsfXMLOut *output, GnmDependent const *dep, char const *id,
221
GnmConventions const *convs)
161
223
if (dep->texpr != NULL) {
163
char *val = gnm_expr_top_as_string (dep->texpr,
164
parse_pos_init_sheet (&pos, dep->sheet),
165
gnm_conventions_default);
225
char *val = gnm_expr_top_as_string
227
parse_pos_init_sheet (&pos, dep->sheet),
166
229
gsf_xml_out_add_cstr (output, id, val);
172
235
sax_read_dep (xmlChar const * const *attrs, char const *name,
173
GnmDependent *dep, GsfXMLIn *xin)
236
GnmDependent *dep, GsfXMLIn *xin, GnmConventions const *convs)
175
238
g_return_val_if_fail (attrs != NULL, FALSE);
176
239
g_return_val_if_fail (attrs[0] != NULL, FALSE);
182
245
dep->sheet = NULL;
183
246
if (attrs[1] != NULL && *attrs[1] != '\0') {
185
dep->texpr = gnm_expr_parse_str_simple (CXML2C (attrs[1]),
186
parse_pos_init_sheet (&pp, gnm_xml_in_cur_sheet (xin)));
249
parse_pos_init_sheet (&pp, gnm_xml_in_cur_sheet (xin));
250
dep->texpr = gnm_expr_parse_str (CXML2C (attrs[1]), &pp,
251
GNM_EXPR_PARSE_DEFAULT,
188
254
dep->texpr = NULL;
194
260
read_dep (GnmDependent *dep, char const *name,
195
261
xmlNodePtr tree, XmlParseContext const *context)
197
char *txt = (gchar *)xmlGetProp (tree, (xmlChar *)name);
263
xmlChar *txt = xmlGetProp (tree, CC2XML (name));
199
265
dep->sheet = NULL;
200
266
dep->texpr = NULL;
201
267
if (txt != NULL && *txt != '\0') {
203
dep->texpr = gnm_expr_parse_str_simple (txt,
204
parse_pos_init_sheet (&pos, context->sheet));
270
parse_pos_init_sheet (&pos, context->sheet);
271
dep->texpr = gnm_expr_parse_str
272
(CC2XML (txt), &pos, GNM_EXPR_PARSE_DEFAULT,
273
sheet_get_conventions (pos.sheet), NULL);
217
286
"widget", view_widget,
218
287
"size_pixels", FALSE,
220
/* g_warning ("%p is widget for so %p", view_widget, so);*/
289
/* g_warning ("%p is widget for so %p", (void *)view_widget, (void *)so);*/
221
290
gtk_widget_show_all (view_widget);
222
291
foo_canvas_item_hide (view_item);
223
292
gnm_pane_widget_register (so, view_widget, view_item);
308
sheet_widget_frame_write_xml_sax (SheetObject const *so, GsfXMLOut *output)
377
sheet_widget_frame_write_xml_sax (SheetObject const *so, GsfXMLOut *output,
378
GnmConventions const *convs)
310
380
SheetWidgetFrame const *swf = SHEET_WIDGET_FRAME (so);
311
381
gsf_xml_out_add_cstr (output, "Label", swf->label);
315
sheet_widget_frame_prep_sax_parser (SheetObject *so, GsfXMLIn *xin, xmlChar const **attrs)
385
sheet_widget_frame_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
386
xmlChar const **attrs,
387
GnmConventions const *convs)
317
389
SheetWidgetFrame *swf = SHEET_WIDGET_FRAME (so);
318
390
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
375
447
cb_frame_config_ok_clicked (GtkWidget *button, FrameConfigState *state)
449
gchar const *text = gtk_entry_get_text(GTK_ENTRY(state->label));
451
cmd_so_set_frame_label (WORKBOOK_CONTROL (state->wbcg),
452
SHEET_OBJECT (state->swf),
453
g_strdup (state->old_label), g_strdup (text));
377
454
gtk_widget_destroy (state->dialog);
458
sheet_widget_frame_set_label (SheetObject *so, char const* str)
460
SheetWidgetFrame *swf = SHEET_WIDGET_FRAME (so);
463
str = str ? str : "";
465
if (go_str_compare (str, swf->label) == 0)
469
swf->label = g_strdup (str);
471
for (ptr = swf->sow.realized_list; ptr != NULL; ptr = ptr->next) {
472
FooCanvasWidget *item = FOO_CANVAS_WIDGET (ptr->data);
473
gtk_frame_set_label (GTK_FRAME (item->widget), str);
381
478
cb_frame_config_cancel_clicked (GtkWidget *button, FrameConfigState *state)
384
SheetWidgetFrame *swf = state->swf;
388
swf->label = g_strdup (state->old_label);
389
for (ptr = swf->sow.realized_list; ptr != NULL ; ptr = ptr->next)
391
(GTK_FRAME (FOO_CANVAS_WIDGET (ptr->data)->widget),
480
sheet_widget_frame_set_label (SHEET_OBJECT (state->swf), state->old_label);
394
482
gtk_widget_destroy (state->dialog);
398
487
cb_frame_label_changed (GtkWidget *entry, FrameConfigState *state)
401
SheetWidgetFrame *swf;
402
489
gchar const *text;
404
491
text = gtk_entry_get_text(GTK_ENTRY(entry));
408
swf->label = g_strdup (text);
410
for (ptr = swf->sow.realized_list; ptr != NULL; ptr = ptr->next) {
412
(GTK_FRAME (FOO_CANVAS_WIDGET (ptr->data)->widget),
492
sheet_widget_frame_set_label (SHEET_OBJECT (state->swf), text);
550
sheet_widget_button_write_xml_sax (SheetObject const *so, GsfXMLOut *output)
628
sheet_widget_button_write_xml_sax (SheetObject const *so, GsfXMLOut *output,
629
GnmConventions const *convs)
553
632
SheetWidgetButton *swb = SHEET_WIDGET_BUTTON (so);
554
633
gsf_xml_out_add_cstr (output, "Label", swb->label);
558
sheet_widget_button_prep_sax_parser (SheetObject *so, GsfXMLIn *xin, xmlChar const **attrs)
637
sheet_widget_button_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
638
xmlChar const **attrs,
639
GnmConventions const *convs)
560
641
SheetWidgetButton *swb = SHEET_WIDGET_BUTTON (so);
561
642
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
568
649
XmlParseContext const *context,
572
653
SheetWidgetButton *swb = SHEET_WIDGET_BUTTON (so);
573
gchar *label = (gchar *)xmlGetProp (tree, (xmlChar *)"Label");
654
xmlChar *label = xmlGetProp (tree, CC2XML ("Label"));
576
657
g_warning ("Could not read a SheetWidgetButton because it lacks a label property.");
580
swb->label = g_strdup (label);
661
swb->label = g_strdup (CC2XML (label));
695
776
#define SHEET_WIDGET_ADJUSTMENT_TYPE (sheet_widget_adjustment_get_type())
696
777
#define SHEET_WIDGET_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHEET_WIDGET_ADJUSTMENT_TYPE, SheetWidgetAdjustment))
697
778
#define DEP_TO_ADJUSTMENT(d_ptr) (SheetWidgetAdjustment *)(((char *)d_ptr) - G_STRUCT_OFFSET(SheetWidgetAdjustment, dep))
779
#define SHEET_WIDGET_ADJUSTMENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SHEET_WIDGET_ADJUSTMENT_TYPE, SheetWidgetAdjustmentClass))
780
#define SWA_CLASS(so) (SHEET_WIDGET_ADJUSTMENT_CLASS (G_OBJECT_GET_CLASS(so)))
700
783
SheetObjectWidget sow;
719
813
swa->being_updated = FALSE;
817
sheet_widget_adjustment_get_adjustment (SheetObject *so)
819
return (SHEET_WIDGET_ADJUSTMENT (so)->adjustment);
823
sheet_widget_adjustment_set_link (SheetObject *so, GnmExprTop const *texpr)
825
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (so);
826
dependent_set_expr (&swa->dep, texpr);
828
dependent_link (&swa->dep);
832
sheet_widget_adjustment_get_link (SheetObject *so)
834
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (so);
835
GnmExprTop const *texpr = swa->dep.texpr;
838
gnm_expr_top_ref (texpr);
723
845
adjustment_eval (GnmDependent *dep)
736
858
adjustment_debug_name (GnmDependent const *dep, GString *target)
738
g_string_append_printf (target, "Adjustment%p", dep);
860
g_string_append_printf (target, "Adjustment%p", (void *)dep);
741
863
static DEPENDENT_MAKE_TYPE (adjustment, NULL)
744
sheet_widget_adjustment_get_ref (SheetWidgetAdjustment const *swa,
745
GnmCellRef *res, gboolean force_sheet)
748
g_return_val_if_fail (swa != NULL, NULL);
750
if (swa->dep.texpr == NULL)
753
target = gnm_expr_top_get_range (swa->dep.texpr);
757
*res = target->v_range.cell.a;
758
value_release (target);
760
if (force_sheet && res->sheet == NULL)
761
res->sheet = sheet_object_get_sheet (SHEET_OBJECT (swa));
766
866
cb_adjustment_widget_value_changed (GtkWidget *widget,
767
867
SheetWidgetAdjustment *swa)
771
871
if (swa->being_updated)
774
if (sheet_widget_adjustment_get_ref (swa, &ref, TRUE) != NULL) {
874
if (so_get_ref (SHEET_OBJECT (swa), &ref, TRUE) != NULL) {
775
875
GnmCell *cell = sheet_cell_fetch (ref.sheet, ref.col, ref.row);
776
876
/* TODO : add more control for precision, XL is stupid */
777
877
int new_val = gnm_fake_round (swa->adjustment->value);
784
884
cmd_so_set_value (widget_wbc (widget),
785
885
/* FIXME: This text sucks: */
786
886
_("Change widget"),
787
&ref, value_new_int (new_val));
887
&ref, value_new_int (new_val),
888
sheet_object_get_sheet (SHEET_OBJECT (swa)));
788
889
swa->being_updated = FALSE;
793
sheet_widget_adjustment_init_full (SheetWidgetAdjustment *swa, GnmCellRef const *ref)
894
sheet_widget_adjustment_set_horizontal (SheetWidgetAdjustment *swa,
899
horizontal = !!horizontal;
900
if (horizontal == swa->horizontal)
902
swa->horizontal = horizontal;
904
/* Change direction for all realized widgets. */
905
for (ptr = swa->sow.realized_list; ptr != NULL; ptr = ptr->next) {
906
FooCanvasItem *item = FOO_CANVAS_ITEM (ptr->data);
908
SOW_CLASS (swa)->create_widget (SHEET_OBJECT (swa));
909
gtk_widget_show (neww);
910
foo_canvas_item_set (item, "widget", neww, NULL);
916
sheet_widget_adjustment_get_property (GObject *obj, guint param_id,
917
GValue *value, GParamSpec *pspec)
919
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (obj);
922
case SWA_PROP_HORIZONTAL:
923
g_value_set_boolean (value, swa->horizontal);
926
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
932
sheet_widget_adjustment_set_property (GObject *obj, guint param_id,
933
GValue const *value, GParamSpec *pspec)
935
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (obj);
938
case SWA_PROP_HORIZONTAL:
939
sheet_widget_adjustment_set_horizontal (swa, g_value_get_boolean (value));
943
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
949
sheet_widget_adjustment_init_full (SheetWidgetAdjustment *swa,
950
GnmCellRef const *ref,
795
953
g_return_if_fail (swa != NULL);
797
955
swa->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0., 0., 100., 1., 10., 0.));
798
#if GLIB_CHECK_VERSION(2,10,0) && GTK_CHECK_VERSION(2,8,14)
799
956
g_object_ref_sink (swa->adjustment);
801
g_object_ref (swa->adjustment);
802
gtk_object_sink (GTK_OBJECT (swa->adjustment));
958
swa->horizontal = horizontal;
805
959
swa->being_updated = FALSE;
806
960
swa->dep.sheet = NULL;
807
961
swa->dep.flags = adjustment_get_dep_type ();
843
999
sheet_widget_adjustment_init_full (dst_swa,
844
sheet_widget_adjustment_get_ref (src_swa, &ref, FALSE));
1000
so_get_ref (src, &ref, FALSE),
1001
src_swa->horizontal);
845
1002
dst_adjust = dst_swa->adjustment;
846
1003
src_adjust = src_swa->adjustment;
908
1069
cb_adjustment_config_ok_clicked (GtkWidget *button, AdjustmentConfigState *state)
910
1071
SheetObject *so = SHEET_OBJECT (state->swa);
912
1073
GnmExprTop const *texpr = gnm_expr_entry_parse (state->expression,
913
1074
parse_pos_init_sheet (&pp, so->sheet),
914
1075
NULL, FALSE, GNM_EXPR_PARSE_DEFAULT);
916
dependent_set_expr (&state->swa->dep, texpr);
917
dependent_link (&state->swa->dep);
918
gnm_expr_top_unref (texpr);
921
state->swa->adjustment->lower = gtk_spin_button_get_value_as_int (
922
GTK_SPIN_BUTTON (state->min));
923
state->swa->adjustment->upper = gtk_spin_button_get_value_as_int (
924
GTK_SPIN_BUTTON (state->max));
925
state->swa->adjustment->step_increment = gtk_spin_button_get_value_as_int (
926
GTK_SPIN_BUTTON (state->inc));
927
state->swa->adjustment->page_increment = gtk_spin_button_get_value_as_int (
928
GTK_SPIN_BUTTON (state->page));
930
gtk_adjustment_changed (state->swa->adjustment);
1076
gboolean horizontal;
1078
horizontal = state->direction_h
1079
? gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state->direction_h))
1080
: state->swa->horizontal;
1082
cmd_so_set_adjustment (WORKBOOK_CONTROL (state->wbcg), so,
1085
gtk_spin_button_get_value_as_int (
1086
GTK_SPIN_BUTTON (state->min)),
1087
gtk_spin_button_get_value_as_int (
1088
GTK_SPIN_BUTTON (state->max)),
1089
gtk_spin_button_get_value_as_int (
1090
GTK_SPIN_BUTTON (state->inc)),
1091
gtk_spin_button_get_value_as_int (
1092
GTK_SPIN_BUTTON (state->page)),
932
1095
gtk_widget_destroy (state->dialog);
942
sheet_widget_adjustment_user_config (SheetObject *so, SheetControl *sc)
1105
sheet_widget_adjustment_user_config_impl (SheetObject *so, SheetControl *sc, char const *undo_label, char const *dialog_label)
944
1107
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (so);
945
WBCGtk *wbcg = scg_wbcg (SHEET_CONTROL_GUI (sc));
1108
SheetWidgetAdjustmentClass *swa_class = SWA_CLASS (swa);
1109
WBCGtk *wbcg = scg_wbcg (SHEET_CONTROL_GUI (sc));
946
1110
AdjustmentConfigState *state;
947
1111
GtkWidget *table;
949
g_return_if_fail (swa != NULL);
1112
gboolean has_directions = (swa_class->htype != G_TYPE_NONE &&
1113
swa_class->vtype != G_TYPE_NONE);
951
1115
/* Only pop up one copy per workbook */
952
1116
if (gnumeric_dialog_raise_if_exists (wbcg, SHEET_OBJECT_CONFIG_KEY))
957
1121
state->wbcg = wbcg;
958
1122
state->sheet = sc_sheet (sc);
959
1123
state->old_focus = NULL;
1124
state->undo_label = (undo_label == NULL) ? NULL : g_strdup (undo_label);
960
1125
state->gui = gnm_glade_xml_new (GO_CMD_CONTEXT (wbcg),
961
1126
"so-scrollbar.glade", NULL, NULL);
962
1127
state->dialog = glade_xml_get_widget (state->gui, "SO-Scrollbar");
1129
if (dialog_label != NULL)
1130
gtk_window_set_title (GTK_WINDOW (state->dialog), dialog_label);
964
1132
table = glade_xml_get_widget (state->gui, "table");
966
1134
state->expression = gnm_expr_entry_new (wbcg, TRUE);
977
1145
gtk_widget_show (GTK_WIDGET (state->expression));
1147
if (has_directions) {
1148
state->direction_h = glade_xml_get_widget (state->gui, "direction_h");
1149
state->direction_v = glade_xml_get_widget (state->gui, "direction_v");
1150
gtk_toggle_button_set_active
1151
(GTK_TOGGLE_BUTTON (swa->horizontal
1152
? state->direction_h
1153
: state->direction_v),
1156
state->direction_h = NULL;
1157
state->direction_v = NULL;
1158
gtk_widget_destroy (glade_xml_get_widget (state->gui, "direction_label"));
1159
gtk_widget_destroy (glade_xml_get_widget (state->gui, "direction_box"));
979
1162
/* TODO : This is silly, no need to be similar to XL here. */
980
1163
state->min = glade_xml_get_widget (state->gui, "spin_min");
981
1164
gtk_spin_button_set_value (GTK_SPIN_BUTTON (state->min), swa->adjustment->lower);
1022
1205
gtk_widget_show (state->dialog);
1209
sheet_widget_adjustment_user_config (SheetObject *so, SheetControl *sc)
1211
sheet_widget_adjustment_user_config_impl (so, sc, N_("Configure Adjustment"),
1212
N_("Adjustment Properties"));
1025
1215
static gboolean
1026
1216
sheet_widget_adjustment_set_sheet (SheetObject *so, Sheet *sheet)
1056
sheet_widget_adjustment_write_xml_sax (SheetObject const *so, GsfXMLOut *output)
1235
sheet_widget_adjustment_write_xml_sax (SheetObject const *so, GsfXMLOut *output,
1236
GnmConventions const *convs)
1058
1238
SheetWidgetAdjustment const *swa = SHEET_WIDGET_ADJUSTMENT (so);
1239
SheetWidgetAdjustmentClass *swa_class = SWA_CLASS (so);
1059
1241
gsf_xml_out_add_float (output, "Min", swa->adjustment->lower, 2);
1060
1242
gsf_xml_out_add_float (output, "Max", swa->adjustment->upper, 2); /* allow scrolling to max */
1061
1243
gsf_xml_out_add_float (output, "Inc", swa->adjustment->step_increment, 2);
1062
1244
gsf_xml_out_add_float (output, "Page", swa->adjustment->page_increment, 2);
1063
1245
gsf_xml_out_add_float (output, "Value", swa->adjustment->value, 2);
1064
sax_write_dep (output, &swa->dep, "Input");
1247
if (swa_class->htype != G_TYPE_NONE && swa_class->vtype != G_TYPE_NONE)
1248
gsf_xml_out_add_bool (output, "Horizontal", swa->horizontal);
1250
sax_write_dep (output, &swa->dep, "Input", convs);
1068
sheet_widget_adjustment_prep_sax_parser (SheetObject *so, GsfXMLIn *xin, xmlChar const **attrs)
1254
sheet_widget_adjustment_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
1255
xmlChar const **attrs,
1256
GnmConventions const *convs)
1070
1258
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (so);
1073
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
1259
SheetWidgetAdjustmentClass *swa_class = SWA_CLASS (so);
1260
swa->horizontal = (swa_class->vtype == G_TYPE_NONE);
1262
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
1074
1266
if (gnm_xml_attr_double (attrs, "Min", &tmp))
1075
1267
swa->adjustment->lower = tmp;
1076
1268
else if (gnm_xml_attr_double (attrs, "Max", &tmp))
1081
1273
swa->adjustment->page_increment = tmp;
1082
1274
else if (gnm_xml_attr_double (attrs, "Value", &tmp))
1083
1275
swa->adjustment->value = tmp;
1084
else if (sax_read_dep (attrs, "Input", &swa->dep, xin))
1276
else if (sax_read_dep (attrs, "Input", &swa->dep, xin, convs))
1278
else if (swa_class->htype != G_TYPE_NONE &&
1279
swa_class->vtype != G_TYPE_NONE &&
1280
gnm_xml_attr_bool (attrs, "Horizontal", &b))
1281
swa->horizontal = b;
1087
1284
swa->dep.flags = adjustment_get_dep_type ();
1088
1285
gtk_adjustment_changed (swa->adjustment);
1109
1310
swa->adjustment->page_increment = tmp;
1110
1311
if (xml_node_get_double (tree, "Value", &tmp))
1111
1312
swa->adjustment->value = tmp;
1313
if (swa_class->htype != G_TYPE_NONE &&
1314
swa_class->vtype != G_TYPE_NONE &&
1315
xml_node_get_bool (tree, "Horizontal", &b))
1316
swa->horizontal = b;
1112
1318
gtk_adjustment_changed (swa->adjustment);
1143
1349
SOW_MAKE_TYPE (adjustment, Adjustment,
1144
1350
sheet_widget_adjustment_user_config,
1145
1351
sheet_widget_adjustment_set_sheet,
1146
sheet_widget_adjustment_clear_sheet,
1147
1353
sheet_widget_adjustment_foreach_dep,
1148
1354
sheet_widget_adjustment_copy,
1149
1355
sheet_widget_adjustment_read_xml_dom,
1150
1356
sheet_widget_adjustment_write_xml_sax,
1151
1357
sheet_widget_adjustment_prep_sax_parser,
1358
sheet_widget_adjustment_get_property,
1359
sheet_widget_adjustment_set_property,
1361
g_object_class_install_property
1362
(object_class, SWA_PROP_HORIZONTAL,
1363
g_param_spec_boolean ("horizontal", NULL, NULL,
1365
GSF_PARAM_STATIC | G_PARAM_READWRITE));
1156
1368
/****************************************************************************/
1157
1369
#define SHEET_WIDGET_SCROLLBAR_TYPE (sheet_widget_scrollbar_get_type ())
1158
1370
#define SHEET_WIDGET_SCROLLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SHEET_WIDGET_SCROLLBAR_TYPE, SheetWidgetScrollbar))
1159
1371
#define DEP_TO_SCROLLBAR(d_ptr) (SheetWidgetScrollbar *)(((char *)d_ptr) - G_STRUCT_OFFSET(SheetWidgetScrollbar, dep))
1161
typedef SheetWidgetAdjustment SheetWidgetScrollbar;
1162
typedef SheetWidgetAdjustmentClass SheetWidgetScrollbarClass;
1373
typedef SheetWidgetAdjustment SheetWidgetScrollbar;
1374
typedef SheetWidgetAdjustmentClass SheetWidgetScrollbarClass;
1164
1376
static GtkWidget *
1165
1377
sheet_widget_scrollbar_create_widget (SheetObjectWidget *sow)
1167
SheetObject *so = SHEET_OBJECT (sow);
1168
1379
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (sow);
1169
1380
GtkWidget *bar;
1171
/* TODO : this is not exactly accurate, but should catch the worst of it
1172
* However we do not have a way to handle resizes.
1174
gboolean is_horizontal = range_width (&so->anchor.cell_bound) > range_height (&so->anchor.cell_bound);
1176
1382
swa->being_updated = TRUE;
1383
bar = swa->horizontal
1178
1384
? gtk_hscrollbar_new (swa->adjustment)
1179
1385
: gtk_vscrollbar_new (swa->adjustment);
1180
1386
GTK_WIDGET_UNSET_FLAGS (bar, GTK_CAN_FOCUS);
1396
sheet_widget_scrollbar_user_config (SheetObject *so, SheetControl *sc)
1398
sheet_widget_adjustment_user_config_impl (so, sc, N_("Configure Scrollbar"),
1399
N_("Scrollbar Properties"));
1190
1403
sheet_widget_scrollbar_class_init (SheetObjectWidgetClass *sow_class)
1405
SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
1192
1407
sow_class->create_widget = &sheet_widget_scrollbar_create_widget;
1408
SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_scrollbar_user_config;
1409
swa_class->htype = GTK_TYPE_HSCROLLBAR;
1410
swa_class->vtype = GTK_TYPE_VSCROLLBAR;
1195
1413
GSF_CLASS (SheetWidgetScrollbar, sheet_widget_scrollbar,
1196
1414
&sheet_widget_scrollbar_class_init, NULL,
1197
SHEET_WIDGET_ADJUSTMENT_TYPE);
1415
SHEET_WIDGET_ADJUSTMENT_TYPE)
1199
1417
/****************************************************************************/
1200
1418
#define SHEET_WIDGET_SPINBUTTON_TYPE (sheet_widget_spinbutton_get_type ())
1443
sheet_widget_spinbutton_user_config (SheetObject *so, SheetControl *sc)
1445
sheet_widget_adjustment_user_config_impl (so, sc, N_("Configure Spinbutton"),
1446
N_("Spinbutton Properties"));
1225
1450
sheet_widget_spinbutton_class_init (SheetObjectWidgetClass *sow_class)
1452
SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
1227
1454
sow_class->create_widget = &sheet_widget_spinbutton_create_widget;
1455
SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_spinbutton_user_config;
1457
swa_class->htype = GTK_TYPE_SPIN_BUTTON;
1458
swa_class->vtype = G_TYPE_NONE;
1230
1461
GSF_CLASS (SheetWidgetSpinbutton, sheet_widget_spinbutton,
1231
1462
&sheet_widget_spinbutton_class_init, NULL,
1232
SHEET_WIDGET_ADJUSTMENT_TYPE);
1463
SHEET_WIDGET_ADJUSTMENT_TYPE)
1234
1465
/****************************************************************************/
1235
1466
#define SHEET_WIDGET_SLIDER_TYPE (sheet_widget_slider_get_type ())
1242
1473
static GtkWidget *
1243
1474
sheet_widget_slider_create_widget (SheetObjectWidget *sow)
1245
SheetObject *so = SHEET_OBJECT (sow);
1246
1476
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (sow);
1247
1477
GtkWidget *slider;
1248
/* TODO : this is not exactly accurate, but should catch the worst of it
1249
* However we do not have a way to handle resizes.
1251
gboolean is_horizontal = range_width (&so->anchor.cell_bound) > range_height (&so->anchor.cell_bound);
1253
1479
swa->being_updated = TRUE;
1254
slider = is_horizontal
1480
slider = swa->horizontal
1255
1481
? gtk_hscale_new (swa->adjustment)
1256
1482
: gtk_vscale_new (swa->adjustment);
1257
1483
gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
1494
sheet_widget_slider_user_config (SheetObject *so, SheetControl *sc)
1496
sheet_widget_adjustment_user_config_impl (so, sc, N_("Configure Slider"),
1497
N_("Slider Properties"));
1268
1501
sheet_widget_slider_class_init (SheetObjectWidgetClass *sow_class)
1503
SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
1270
1505
sow_class->create_widget = &sheet_widget_slider_create_widget;
1506
SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_slider_user_config;
1508
swa_class->htype = GTK_TYPE_HSCALE;
1509
swa_class->vtype = GTK_TYPE_VSCALE;
1273
1512
GSF_CLASS (SheetWidgetSlider, sheet_widget_slider,
1274
1513
&sheet_widget_slider_class_init, NULL,
1275
SHEET_WIDGET_ADJUSTMENT_TYPE);
1514
SHEET_WIDGET_ADJUSTMENT_TYPE)
1277
1516
/****************************************************************************/
1278
1517
#define SHEET_WIDGET_CHECKBOX_TYPE (sheet_widget_checkbox_get_type ())
1420
1659
sheet_object_widget_class->finalize (obj);
1424
sheet_widget_checkbox_get_ref (SheetWidgetCheckbox const *swc,
1425
GnmCellRef *res, gboolean force_sheet)
1428
g_return_val_if_fail (swc != NULL, NULL);
1430
if (swc->dep.texpr == NULL)
1433
target = gnm_expr_top_get_range (swc->dep.texpr);
1437
*res = target->v_range.cell.a;
1438
value_release (target);
1440
if (force_sheet && res->sheet == NULL)
1441
res->sheet = sheet_object_get_sheet (SHEET_OBJECT (swc));
1446
1663
cb_checkbox_toggled (GtkToggleButton *button, SheetWidgetCheckbox *swc)
1452
1669
swc->value = gtk_toggle_button_get_active (button);
1453
1670
sheet_widget_checkbox_set_active (swc);
1455
if (sheet_widget_checkbox_get_ref (swc, &ref, TRUE) != NULL) {
1672
if (so_get_ref (SHEET_OBJECT (swc), &ref, TRUE) != NULL) {
1456
1673
gboolean new_val = gtk_toggle_button_get_active (button);
1457
1674
cmd_so_set_value (widget_wbc (GTK_WIDGET (button)),
1458
1675
/* FIXME: This text sucks: */
1459
1676
_("Clicking checkbox"),
1460
&ref, value_new_bool (new_val));
1677
&ref, value_new_bool (new_val),
1678
sheet_object_get_sheet (SHEET_OBJECT (swc)));
1473
1691
GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
1474
1692
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), swc->value);
1475
1693
g_signal_connect (G_OBJECT (button),
1477
G_CALLBACK (cb_checkbox_toggled), swc);
1695
G_CALLBACK (cb_checkbox_toggled), swc);
1486
1704
SheetWidgetCheckbox *dst_swc = SHEET_WIDGET_CHECKBOX (dst);
1487
1705
GnmCellRef ref;
1488
1706
sheet_widget_checkbox_init_full (dst_swc,
1489
sheet_widget_checkbox_get_ref (src_swc, &ref, FALSE),
1707
so_get_ref (src, &ref, FALSE),
1491
1709
dst_swc->value = src_swc->value;
1551
1769
GnmExprTop const *texpr = gnm_expr_entry_parse (state->expression,
1552
1770
parse_pos_init_sheet (&pp, so->sheet),
1553
1771
NULL, FALSE, GNM_EXPR_PARSE_DEFAULT);
1554
if (texpr != NULL) {
1555
dependent_set_expr (&state->swc->dep, texpr);
1556
dependent_link (&state->swc->dep);
1557
gnm_expr_top_unref (texpr);
1772
gchar const *text = gtk_entry_get_text(GTK_ENTRY(state->label));
1774
cmd_so_set_checkbox (WORKBOOK_CONTROL (state->wbcg), so,
1775
texpr, g_strdup (state->old_label), g_strdup (text));
1560
1777
gtk_widget_destroy (state->dialog);
1686
sheet_widget_checkbox_write_xml_sax (SheetObject const *so, GsfXMLOut *output)
1892
sheet_widget_checkbox_write_xml_sax (SheetObject const *so, GsfXMLOut *output,
1893
GnmConventions const *convs)
1688
1895
SheetWidgetCheckbox const *swc = SHEET_WIDGET_CHECKBOX (so);
1690
1897
gsf_xml_out_add_cstr (output, "Label", swc->label);
1691
1898
gsf_xml_out_add_int (output, "Value", swc->value);
1692
sax_write_dep (output, &swc->dep, "Input");
1899
sax_write_dep (output, &swc->dep, "Input", convs);
1696
sheet_widget_checkbox_prep_sax_parser (SheetObject *so, GsfXMLIn *xin, xmlChar const **attrs)
1903
sheet_widget_checkbox_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
1904
xmlChar const **attrs,
1905
GnmConventions const *convs)
1698
1907
SheetWidgetCheckbox *swc = SHEET_WIDGET_CHECKBOX (so);
1703
1912
swc->label = g_strdup (CXML2C (attrs[1]));
1704
1913
} else if (gnm_xml_attr_int (attrs, "Value", &swc->value))
1706
else if (sax_read_dep (attrs, "Input", &swc->dep, xin))
1915
else if (sax_read_dep (attrs, "Input", &swc->dep, xin, convs))
1713
1922
xmlNodePtr tree)
1715
1924
SheetWidgetCheckbox *swc = SHEET_WIDGET_CHECKBOX (so);
1716
gchar *label = (gchar *)xmlGetProp (tree, (xmlChar *)"Label");
1925
xmlChar *label = xmlGetProp (tree, CC2XML ("Label"));
1719
1928
g_warning ("Could not read a CheckBoxWidget object because it lacks a label property");
1723
swc->label = g_strdup (label);
1932
swc->label = g_strdup (CC2XML (label));
1724
1933
xmlFree (label);
1726
1935
read_dep (&swc->dep, "Input", tree, context);
1763
1985
SOW_MAKE_TYPE (checkbox, Checkbox,
1764
1986
sheet_widget_checkbox_user_config,
1765
1987
sheet_widget_checkbox_set_sheet,
1766
sheet_widget_checkbox_clear_sheet,
1767
1989
sheet_widget_checkbox_foreach_dep,
1768
1990
sheet_widget_checkbox_copy,
1769
1991
sheet_widget_checkbox_read_xml_dom,
1806
2028
GSF_CLASS (SheetWidgetToggleButton, sheet_widget_toggle_button,
1807
2029
&sheet_widget_toggle_button_class_init, NULL,
1808
SHEET_WIDGET_CHECKBOX_TYPE);
2030
SHEET_WIDGET_CHECKBOX_TYPE)
1809
2032
/****************************************************************************/
1811
2034
#define SHEET_WIDGET_RADIO_BUTTON_TYPE (sheet_widget_radio_button_get_type ())
1888
2111
static GtkWidget *
1889
2112
sheet_widget_radio_button_create_widget (SheetObjectWidget *sow)
1891
GtkWidget *w = gtk_radio_button_new_with_label (NULL, "RadioButton");
2114
SheetWidgetRadioButton *swrb = SHEET_WIDGET_RADIO_BUTTON (sow);
2115
/* FIXME: NULL group? */
2116
GtkWidget *w = gtk_radio_button_new_with_label (NULL,
1892
2118
g_signal_connect (G_OBJECT (w),
1894
G_CALLBACK (sheet_widget_radio_button_toggled), sow);
2120
G_CALLBACK (sheet_widget_radio_button_toggled), sow);
1909
sheet_widget_radio_button_clear_sheet (SheetObject *so)
1911
SheetWidgetRadioButton *swrb = SHEET_WIDGET_RADIO_BUTTON (so);
1913
g_return_val_if_fail (swrb != NULL, TRUE);
1915
if (dependent_is_linked (&swrb->dep))
1916
dependent_unlink (&swrb->dep);
1917
swrb->dep.sheet = NULL;
1922
2135
sheet_widget_radio_button_foreach_dep (SheetObject *so,
1923
2136
SheetObjectForeachDepFunc func,
1980
2193
SheetWidgetRadioButton *swrb = SHEET_WIDGET_RADIO_BUTTON (obj);
1982
2195
switch (param_id) {
1984
2197
sheet_widget_radio_button_set_label (SHEET_OBJECT (swrb),
1985
g_value_get_string (value));
2198
g_value_get_string (value));
1987
case SOC_PROP_MARKUP:
2200
case SOR_PROP_MARKUP:
1989
sheet_widget_radio_button_set_markup (SHEET_OBJECT (swc),
1990
g_value_peek_pointer (value));
2202
sheet_widget_radio_button_set_markup (SHEET_OBJECT (swrb),
2203
g_value_peek_pointer (value));
2013
2226
g_param_spec_string ("text", NULL, NULL, NULL,
2014
2227
GSF_PARAM_STATIC | G_PARAM_READWRITE));
2015
2228
g_object_class_install_property
2016
(object_class, SOC_PROP_MARKUP,
2229
(object_class, SOR_PROP_MARKUP,
2017
2230
g_param_spec_boxed ("markup", NULL, NULL, PANGO_TYPE_ATTR_LIST,
2018
2231
GSF_PARAM_STATIC | G_PARAM_READWRITE));
2049
2262
static guint list_base_signals [LIST_BASE_LAST_SIGNAL] = { 0 };
2050
2263
static GType sheet_widget_list_base_get_type (void);
2053
sheet_widget_list_base_get_ref (SheetWidgetListBase const *swl,
2054
GnmCellRef *res, gboolean force_sheet)
2058
g_return_val_if_fail (swl != NULL, NULL);
2060
if (swl->output_dep.texpr == NULL)
2063
target = gnm_expr_top_get_range (swl->output_dep.texpr);
2067
*res = target->v_range.cell.a;
2068
value_release (target);
2070
if (force_sheet && res->sheet == NULL)
2071
res->sheet = sheet_object_get_sheet (SHEET_OBJECT (swl));
2076
2266
sheet_widget_list_base_set_selection (SheetWidgetListBase *swl, int selection,
2077
2267
WorkbookControl *wbc)
2088
2278
if (swl->selection != selection) {
2089
2279
swl->selection = selection;
2090
2280
if (NULL!= wbc &&
2091
sheet_widget_list_base_get_ref (swl, &ref, TRUE) != NULL)
2281
so_get_ref (SHEET_OBJECT (swl), &ref, TRUE) != NULL)
2092
2282
cmd_so_set_value (wbc,
2093
2283
_("Clicking in list"),
2094
&ref, value_new_int (swl->selection));
2284
&ref, value_new_int (swl->selection),
2285
sheet_object_get_sheet (SHEET_OBJECT (swl)));
2096
2287
g_signal_emit (G_OBJECT (swl),
2097
2288
list_base_signals [LIST_BASE_SELECTION_CHANGED], 0);
2142
2333
SheetWidgetListBase *swl = DEP_TO_LIST_BASE_CONTENT (dep);
2144
GnmValue *v = gnm_expr_top_eval (dep->texpr,
2145
eval_pos_init_dep (&ep, dep),
2146
GNM_EXPR_EVAL_PERMIT_NON_SCALAR | GNM_EXPR_EVAL_PERMIT_EMPTY);
2147
2336
GtkListStore *model;
2338
if (dep->texpr != NULL) {
2339
v = gnm_expr_top_eval (dep->texpr,
2340
eval_pos_init_dep (&ep, dep),
2341
GNM_EXPR_EVAL_PERMIT_NON_SCALAR |
2342
GNM_EXPR_EVAL_PERMIT_EMPTY);
2151
2344
model = gtk_list_store_new (1, G_TYPE_STRING);
2152
value_area_foreach (v, &ep, CELL_ITER_ALL,
2153
(GnmValueIterFunc) cb_collect, model);
2345
if ((dep != NULL) && (v != NULL)) {
2346
value_area_foreach (v, &ep, CELL_ITER_ALL,
2347
(GnmValueIterFunc) cb_collect, model);
2156
2351
if (NULL != swl->model)
2157
2352
g_object_unref (G_OBJECT (swl->model));
2221
sheet_widget_list_base_clear_sheet (SheetObject *so)
2223
SheetWidgetListBase *swl = SHEET_WIDGET_LIST_BASE (so);
2225
g_return_val_if_fail (swl != NULL, TRUE);
2227
if (dependent_is_linked (&swl->content_dep))
2228
dependent_unlink (&swl->content_dep);
2229
if (dependent_is_linked (&swl->output_dep))
2230
dependent_unlink (&swl->output_dep);
2231
swl->content_dep.sheet = swl->output_dep.sheet = NULL;
2236
2416
sheet_widget_list_base_foreach_dep (SheetObject *so,
2237
2417
SheetObjectForeachDepFunc func,
2246
sheet_widget_list_base_write_xml_sax (SheetObject const *so, GsfXMLOut *output)
2426
sheet_widget_list_base_write_xml_sax (SheetObject const *so, GsfXMLOut *output,
2427
GnmConventions const *convs)
2248
2429
SheetWidgetListBase const *swl = SHEET_WIDGET_LIST_BASE (so);
2249
sax_write_dep (output, &swl->content_dep, "Content");
2250
sax_write_dep (output, &swl->output_dep, "Output");
2430
sax_write_dep (output, &swl->content_dep, "Content", convs);
2431
sax_write_dep (output, &swl->output_dep, "Output", convs);
2254
sheet_widget_list_base_prep_sax_parser (SheetObject *so, GsfXMLIn *xin, xmlChar const **attrs)
2435
sheet_widget_list_base_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
2436
xmlChar const **attrs,
2437
GnmConventions const *convs)
2256
2439
SheetWidgetListBase *swl = SHEET_WIDGET_LIST_BASE (so);
2258
2441
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
2259
if (sax_read_dep (attrs, "Content", &swl->content_dep, xin)) ;
2260
else if (sax_read_dep (attrs, "Output", &swl->output_dep, xin)) ;
2442
if (sax_read_dep (attrs, "Content", &swl->content_dep, xin, convs)) ;
2443
else if (sax_read_dep (attrs, "Output", &swl->output_dep, xin, convs)) ;
2263
2446
static gboolean
2285
2468
SOW_MAKE_TYPE (list_base, ListBase,
2286
2469
sheet_widget_list_base_user_config,
2287
2470
sheet_widget_list_base_set_sheet,
2288
sheet_widget_list_base_clear_sheet,
2289
2472
sheet_widget_list_base_foreach_dep,
2291
2474
sheet_widget_list_base_read_xml_dom,
2424
2607
GSF_CLASS (SheetWidgetList, sheet_widget_list,
2425
2608
&sheet_widget_list_class_init, NULL,
2426
SHEET_WIDGET_LIST_BASE_TYPE);
2609
SHEET_WIDGET_LIST_BASE_TYPE)
2428
2611
/****************************************************************************/
2429
2612
#define SHEET_WIDGET_COMBO_TYPE (sheet_widget_combo_get_type ())