3 * Copyright (C) 2000 Alfons Hoogervorst
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
21 /* I derived this class from hruler. S in HRuler could be read as
22 * Sylpheed (sylpheed.good-day.net), but also [S]ettable HRuler.
23 * I basically ripped apart the draw_ticks member of HRuler; it
24 * now draws the ticks at ruler->max_size. so gtk_ruler_set_range's
25 * last parameter has the distance between two ticks (which is
26 * the width of the fixed font character!
28 * -- Alfons (alfons@proteus.demon.nl)
34 #include <gtk/gtkhruler.h>
35 #include "gtkshruler.h"
37 #define RULER_HEIGHT 14
38 #define MINIMUM_INCR 5
39 #define MAXIMUM_SUBDIVIDE 5
40 #define MAXIMUM_SCALES 10
42 #define ROUND(x) ((int) ((x) + 0.5))
44 static void gtk_shruler_class_init (GtkSHRulerClass
*klass
);
45 static void gtk_shruler_init (GtkSHRuler
*hruler
);
46 static gint
gtk_shruler_motion_notify (GtkWidget
*widget
,
47 GdkEventMotion
*event
);
48 static void gtk_shruler_draw_ticks (GtkRuler
*ruler
);
50 static void gtk_shruler_draw_pos (GtkRuler
*ruler
);
54 gtk_shruler_get_type(void)
56 static guint shruler_type
= 0;
58 if ( !shruler_type
) {
59 static const GtkTypeInfo shruler_info
= {
62 sizeof (GtkSHRulerClass
),
63 (GtkClassInitFunc
) gtk_shruler_class_init
,
64 (GtkObjectInitFunc
) gtk_shruler_init
,
65 /* reserved_1 */ NULL
,
66 /* reserved_2 */ NULL
,
67 (GtkClassInitFunc
) NULL
,
69 /* inherit from GtkHRuler */
70 shruler_type
= gtk_type_unique( gtk_hruler_get_type (), &shruler_info
);
76 gtk_shruler_class_init(GtkSHRulerClass
* klass
)
78 GtkWidgetClass
* widget_class
;
79 GtkRulerClass
* hruler_class
;
81 widget_class
= (GtkWidgetClass
*) klass
;
82 hruler_class
= (GtkRulerClass
*) klass
;
84 /* just neglect motion notify events */
85 widget_class
->motion_notify_event
= NULL
/* gtk_shruler_motion_notify */;
87 /* we want the old ruler draw ticks... */
88 /* ruler_class->draw_ticks = gtk_hruler_draw_ticks; */
89 hruler_class
->draw_ticks
= gtk_shruler_draw_ticks
;
91 /* unimplemented draw pos */
92 hruler_class
->draw_pos
= NULL
;
94 hruler_class->draw_pos = gtk_shruler_draw_pos;
99 gtk_shruler_init (GtkSHRuler
* shruler
)
103 widget
= GTK_WIDGET (shruler
);
104 widget
->requisition
.width
= widget
->style
->klass
->xthickness
* 2 + 1;
105 widget
->requisition
.height
= widget
->style
->klass
->ythickness
* 2 + RULER_HEIGHT
;
110 gtk_shruler_new(void)
112 return GTK_WIDGET( gtk_type_new( gtk_shruler_get_type() ) );
116 gtk_shruler_motion_notify(GtkWidget
*widget
,
117 GdkEventMotion
*event
)
119 /* I could have perhaps set this to NULL */
124 gtk_shruler_draw_ticks(GtkRuler
*ruler
)
135 g_return_if_fail (ruler
!= NULL
);
136 g_return_if_fail (GTK_IS_HRULER (ruler
));
138 if (!GTK_WIDGET_DRAWABLE (ruler
))
141 widget
= GTK_WIDGET (ruler
);
143 gc
= widget
->style
->fg_gc
[GTK_STATE_NORMAL
];
144 bg_gc
= widget
->style
->bg_gc
[GTK_STATE_NORMAL
];
145 font
= widget
->style
->font
;
147 xthickness
= widget
->style
->klass
->xthickness
;
148 ythickness
= widget
->style
->klass
->ythickness
;
150 width
= widget
->allocation
.width
;
151 height
= widget
->allocation
.height
- ythickness
* 2;
153 gtk_paint_box (widget
->style
, ruler
->backing_store
,
154 GTK_STATE_NORMAL
, GTK_SHADOW_OUT
,
155 NULL
, widget
, "hruler",
157 widget
->allocation
.width
, widget
->allocation
.height
);
160 gdk_draw_line (ruler
->backing_store
, gc
,
163 widget
->allocation
.width
- xthickness
,
164 height
+ ythickness
);
167 /* assume ruler->max_size has the char width */
168 /* i is increment of char_width, pos is label number */
169 for ( i
= 0, pos
= 0; i
< widget
->allocation
.width
- xthickness
; i
+= ruler
->max_size
, pos
++ ) {
170 int length
= ythickness
/ 2;
172 if ( pos
% 10 == 0 ) length
= ( 4 * ythickness
);
173 else if (pos
% 5 == 0 ) length
= ( 2 * ythickness
);
175 gdk_draw_line(ruler
->backing_store
, gc
,
176 i
, height
+ ythickness
,
179 if ( pos
% 10 == 0 ) {
182 sprintf(buf
, "%d", (int) pos
);
183 gdk_draw_string(ruler
->backing_store
, font
, gc
,
184 i
+ 2, ythickness
+ font
->ascent
- 1,
190 /* gtk_ruler_set_pos() - does not work yet, need to reimplement
191 * gtk_ruler_draw_pos(). */
193 gtk_shruler_set_pos(GtkSHRuler
* ruler
, gfloat pos
)
196 g_return_if_fail( ruler
!= NULL
);
198 ruler_
= GTK_RULER(ruler
);
200 if ( pos
< ruler_
->lower
)
202 if ( pos
> ruler_
->upper
)
205 ruler_
->position
= pos
;
207 /* Make sure the ruler has been allocated already */
208 if ( ruler_
->backing_store
!= NULL
)
209 gtk_ruler_draw_pos(ruler_
);