1
/* GTK - The GIMP Toolkit
2
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this library; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
21
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22
* file for a list of people on the GTK+ Team. See the ChangeLog
23
* files for a list of changes. These files are distributed with
24
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
29
#include "gtkprivate.h"
42
static void gtk_ruler_realize (GtkWidget *widget);
43
static void gtk_ruler_unrealize (GtkWidget *widget);
44
static void gtk_ruler_size_allocate (GtkWidget *widget,
45
GtkAllocation *allocation);
46
static gint gtk_ruler_expose (GtkWidget *widget,
47
GdkEventExpose *event);
48
static void gtk_ruler_make_pixmap (GtkRuler *ruler);
49
static void gtk_ruler_set_property (GObject *object,
53
static void gtk_ruler_get_property (GObject *object,
58
static const GtkRulerMetric ruler_metrics[] =
60
{ "Pixel", "Pi", 1.0, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }},
61
{ "Inches", "In", 72.0, { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }, { 1, 2, 4, 8, 16 }},
62
{ "Centimeters", "Cn", 28.35, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }},
65
G_DEFINE_TYPE (GtkRuler, gtk_ruler, GTK_TYPE_WIDGET)
68
gtk_ruler_class_init (GtkRulerClass *class)
70
GObjectClass *gobject_class;
71
GtkWidgetClass *widget_class;
73
gobject_class = G_OBJECT_CLASS (class);
74
widget_class = (GtkWidgetClass*) class;
76
gobject_class->set_property = gtk_ruler_set_property;
77
gobject_class->get_property = gtk_ruler_get_property;
79
widget_class->realize = gtk_ruler_realize;
80
widget_class->unrealize = gtk_ruler_unrealize;
81
widget_class->size_allocate = gtk_ruler_size_allocate;
82
widget_class->expose_event = gtk_ruler_expose;
84
class->draw_ticks = NULL;
85
class->draw_pos = NULL;
87
g_object_class_install_property (gobject_class,
89
g_param_spec_double ("lower",
91
P_("Lower limit of ruler"),
95
GTK_PARAM_READWRITE));
97
g_object_class_install_property (gobject_class,
99
g_param_spec_double ("upper",
101
P_("Upper limit of ruler"),
105
GTK_PARAM_READWRITE));
107
g_object_class_install_property (gobject_class,
109
g_param_spec_double ("position",
111
P_("Position of mark on the ruler"),
115
GTK_PARAM_READWRITE));
117
g_object_class_install_property (gobject_class,
119
g_param_spec_double ("max-size",
121
P_("Maximum size of the ruler"),
125
GTK_PARAM_READWRITE));
129
* The metric used for the ruler.
133
g_object_class_install_property (gobject_class,
135
g_param_spec_enum ("metric",
137
P_("The metric used for the ruler"),
138
GTK_TYPE_METRIC_TYPE,
140
GTK_PARAM_READWRITE));
144
gtk_ruler_init (GtkRuler *ruler)
146
ruler->backing_store = NULL;
149
ruler->slider_size = 0;
155
gtk_ruler_set_metric (ruler, GTK_PIXELS);
159
gtk_ruler_set_property (GObject *object,
164
GtkRuler *ruler = GTK_RULER (object);
169
gtk_ruler_set_range (ruler, g_value_get_double (value), ruler->upper,
170
ruler->position, ruler->max_size);
173
gtk_ruler_set_range (ruler, ruler->lower, g_value_get_double (value),
174
ruler->position, ruler->max_size);
177
gtk_ruler_set_range (ruler, ruler->lower, ruler->upper,
178
g_value_get_double (value), ruler->max_size);
181
gtk_ruler_set_range (ruler, ruler->lower, ruler->upper,
182
ruler->position, g_value_get_double (value));
185
gtk_ruler_set_metric (ruler, g_value_get_enum (value));
188
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
194
gtk_ruler_get_property (GObject *object,
199
GtkRuler *ruler = GTK_RULER (object);
204
g_value_set_double (value, ruler->lower);
207
g_value_set_double (value, ruler->upper);
210
g_value_set_double (value, ruler->position);
213
g_value_set_double (value, ruler->max_size);
216
g_value_set_enum (value, gtk_ruler_get_metric (ruler));
219
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
225
gtk_ruler_set_metric (GtkRuler *ruler,
226
GtkMetricType metric)
228
g_return_if_fail (GTK_IS_RULER (ruler));
230
ruler->metric = (GtkRulerMetric *) &ruler_metrics[metric];
232
if (GTK_WIDGET_DRAWABLE (ruler))
233
gtk_widget_queue_draw (GTK_WIDGET (ruler));
235
g_object_notify (G_OBJECT (ruler), "metric");
239
* gtk_ruler_get_metric:
240
* @ruler: a #GtkRuler
242
* Gets the units used for a #GtkRuler. See gtk_ruler_set_metric().
244
* Return value: the units currently used for @ruler
247
gtk_ruler_get_metric (GtkRuler *ruler)
251
g_return_val_if_fail (GTK_IS_RULER (ruler), 0);
253
for (i = 0; i < G_N_ELEMENTS (ruler_metrics); i++)
254
if (ruler->metric == &ruler_metrics[i])
257
g_assert_not_reached ();
263
gtk_ruler_set_range (GtkRuler *ruler,
269
g_return_if_fail (GTK_IS_RULER (ruler));
271
g_object_freeze_notify (G_OBJECT (ruler));
272
if (ruler->lower != lower)
274
ruler->lower = lower;
275
g_object_notify (G_OBJECT (ruler), "lower");
277
if (ruler->upper != upper)
279
ruler->upper = upper;
280
g_object_notify (G_OBJECT (ruler), "upper");
282
if (ruler->position != position)
284
ruler->position = position;
285
g_object_notify (G_OBJECT (ruler), "position");
287
if (ruler->max_size != max_size)
289
ruler->max_size = max_size;
290
g_object_notify (G_OBJECT (ruler), "max-size");
292
g_object_thaw_notify (G_OBJECT (ruler));
294
if (GTK_WIDGET_DRAWABLE (ruler))
295
gtk_widget_queue_draw (GTK_WIDGET (ruler));
299
* gtk_ruler_get_range:
300
* @ruler: a #GtkRuler
301
* @lower: location to store lower limit of the ruler, or %NULL
302
* @upper: location to store upper limit of the ruler, or %NULL
303
* @position: location to store the current position of the mark on the ruler, or %NULL
304
* @max_size: location to store the maximum size of the ruler used when calculating
305
* the space to leave for the text, or %NULL.
307
* Retrieves values indicating the range and current position of a #GtkRuler.
308
* See gtk_ruler_set_range().
311
gtk_ruler_get_range (GtkRuler *ruler,
317
g_return_if_fail (GTK_IS_RULER (ruler));
320
*lower = ruler->lower;
322
*upper = ruler->upper;
324
*position = ruler->position;
326
*max_size = ruler->max_size;
330
gtk_ruler_draw_ticks (GtkRuler *ruler)
332
g_return_if_fail (GTK_IS_RULER (ruler));
334
if (GTK_RULER_GET_CLASS (ruler)->draw_ticks)
335
GTK_RULER_GET_CLASS (ruler)->draw_ticks (ruler);
339
gtk_ruler_draw_pos (GtkRuler *ruler)
341
g_return_if_fail (GTK_IS_RULER (ruler));
343
if (GTK_RULER_GET_CLASS (ruler)->draw_pos)
344
GTK_RULER_GET_CLASS (ruler)->draw_pos (ruler);
349
gtk_ruler_realize (GtkWidget *widget)
352
GdkWindowAttr attributes;
353
gint attributes_mask;
355
ruler = GTK_RULER (widget);
356
GTK_WIDGET_SET_FLAGS (ruler, GTK_REALIZED);
358
attributes.window_type = GDK_WINDOW_CHILD;
359
attributes.x = widget->allocation.x;
360
attributes.y = widget->allocation.y;
361
attributes.width = widget->allocation.width;
362
attributes.height = widget->allocation.height;
363
attributes.wclass = GDK_INPUT_OUTPUT;
364
attributes.visual = gtk_widget_get_visual (widget);
365
attributes.colormap = gtk_widget_get_colormap (widget);
366
attributes.event_mask = gtk_widget_get_events (widget);
367
attributes.event_mask |= (GDK_EXPOSURE_MASK |
368
GDK_POINTER_MOTION_MASK |
369
GDK_POINTER_MOTION_HINT_MASK);
371
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
373
widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
374
gdk_window_set_user_data (widget->window, ruler);
376
widget->style = gtk_style_attach (widget->style, widget->window);
377
gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE);
379
gtk_ruler_make_pixmap (ruler);
383
gtk_ruler_unrealize (GtkWidget *widget)
385
GtkRuler *ruler = GTK_RULER (widget);
387
if (ruler->backing_store)
389
g_object_unref (ruler->backing_store);
390
ruler->backing_store = NULL;
393
if (ruler->non_gr_exp_gc)
395
g_object_unref (ruler->non_gr_exp_gc);
396
ruler->non_gr_exp_gc = NULL;
399
if (GTK_WIDGET_CLASS (gtk_ruler_parent_class)->unrealize)
400
(* GTK_WIDGET_CLASS (gtk_ruler_parent_class)->unrealize) (widget);
404
gtk_ruler_size_allocate (GtkWidget *widget,
405
GtkAllocation *allocation)
407
GtkRuler *ruler = GTK_RULER (widget);
409
widget->allocation = *allocation;
411
if (GTK_WIDGET_REALIZED (widget))
413
gdk_window_move_resize (widget->window,
414
allocation->x, allocation->y,
415
allocation->width, allocation->height);
417
gtk_ruler_make_pixmap (ruler);
422
gtk_ruler_expose (GtkWidget *widget,
423
GdkEventExpose *event)
427
if (GTK_WIDGET_DRAWABLE (widget))
429
ruler = GTK_RULER (widget);
431
gtk_ruler_draw_ticks (ruler);
433
gdk_draw_drawable (widget->window,
434
ruler->non_gr_exp_gc,
435
ruler->backing_store,
437
widget->allocation.width,
438
widget->allocation.height);
440
gtk_ruler_draw_pos (ruler);
447
gtk_ruler_make_pixmap (GtkRuler *ruler)
453
widget = GTK_WIDGET (ruler);
455
if (ruler->backing_store)
457
gdk_drawable_get_size (ruler->backing_store, &width, &height);
458
if ((width == widget->allocation.width) &&
459
(height == widget->allocation.height))
462
g_object_unref (ruler->backing_store);
465
ruler->backing_store = gdk_pixmap_new (widget->window,
466
widget->allocation.width,
467
widget->allocation.height,
473
if (!ruler->non_gr_exp_gc)
475
ruler->non_gr_exp_gc = gdk_gc_new (widget->window);
476
gdk_gc_set_exposures (ruler->non_gr_exp_gc, FALSE);
480
#define __GTK_RULER_C__
481
#include "gtkaliasdef.c"