aboutsummaryrefslogtreecommitdiff
path: root/src/gtkshruler.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-01-12 11:22:08 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-01-12 11:22:08 +0000
commitb9ca7b1ef5cd1f96ae6e28ae78d12c1e3258c23f (patch)
tree1203adec5f70af1ddd49868528d8d3a5b9004329 /src/gtkshruler.c
Initial import of Sylpheed (GTK2 version).
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@1 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src/gtkshruler.c')
-rw-r--r--src/gtkshruler.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/gtkshruler.c b/src/gtkshruler.c
new file mode 100644
index 00000000..1e350a58
--- /dev/null
+++ b/src/gtkshruler.c
@@ -0,0 +1,218 @@
+/* GtkSHRuler
+ *
+ * Copyright (C) 2000-2004 Alfons Hoogervorst & The Sylpheed Claws Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* I derived this class from hruler. S in HRuler could be read as
+ * Sylpheed (sylpheed.good-day.net), but also [S]ettable HRuler.
+ * I basically ripped apart the draw_ticks member of HRuler; it
+ * now draws the ticks at ruler->max_size. so gtk_ruler_set_range's
+ * last parameter has the distance between two ticks (which is
+ * the width of the fixed font character!
+ *
+ * -- Alfons
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+#include <gtk/gtkhruler.h>
+#include "gtkshruler.h"
+
+#define RULER_HEIGHT 14
+#define MINIMUM_INCR 5
+#define MAXIMUM_SUBDIVIDE 5
+#define MAXIMUM_SCALES 10
+
+#define ROUND(x) ((int) ((x) + 0.5))
+
+static void gtk_shruler_class_init (GtkSHRulerClass *klass);
+static void gtk_shruler_init (GtkSHRuler *hruler);
+#if 0
+static gint gtk_shruler_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event);
+#endif
+static void gtk_shruler_draw_ticks (GtkRuler *ruler);
+#if 0
+static void gtk_shruler_draw_pos (GtkRuler *ruler);
+#endif
+
+GType
+gtk_shruler_get_type(void)
+{
+ static GType shruler_type = 0;
+
+ if ( !shruler_type ) {
+ static const GTypeInfo shruler_info = {
+ sizeof (GtkSHRulerClass),
+
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+
+ (GClassInitFunc) gtk_shruler_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+
+ sizeof (GtkSHRuler),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gtk_shruler_init,
+ };
+ /* inherit from GtkHRuler */
+ shruler_type = g_type_register_static ( GTK_TYPE_HRULER, "GtkSHRuler", &shruler_info, (GTypeFlags) 0 );
+ }
+ return shruler_type;
+}
+
+static void
+gtk_shruler_class_init(GtkSHRulerClass * klass)
+{
+ GtkWidgetClass * widget_class;
+ GtkRulerClass * hruler_class;
+
+ widget_class = (GtkWidgetClass*) klass;
+ hruler_class = (GtkRulerClass*) klass;
+
+ /* just neglect motion notify events */
+ widget_class->motion_notify_event = NULL /* gtk_shruler_motion_notify */;
+
+ /* we want the old ruler draw ticks... */
+ /* ruler_class->draw_ticks = gtk_hruler_draw_ticks; */
+ hruler_class->draw_ticks = gtk_shruler_draw_ticks;
+
+ /* unimplemented draw pos */
+ hruler_class->draw_pos = NULL;
+/*
+ hruler_class->draw_pos = gtk_shruler_draw_pos;
+*/
+}
+
+static void
+gtk_shruler_init (GtkSHRuler * shruler)
+{
+ GtkWidget * widget;
+
+ widget = GTK_WIDGET (shruler);
+ widget->requisition.width = widget->style->xthickness * 2 + 1;
+ widget->requisition.height = widget->style->ythickness * 2 + RULER_HEIGHT;
+}
+
+
+GtkWidget*
+gtk_shruler_new(void)
+{
+ return GTK_WIDGET( g_object_new( gtk_shruler_get_type(), NULL ) );
+}
+
+#if 0
+static gint
+gtk_shruler_motion_notify(GtkWidget *widget,
+ GdkEventMotion *event)
+{
+ /* I could have perhaps set this to NULL */
+ return FALSE;
+}
+#endif
+
+static void
+gtk_shruler_draw_ticks(GtkRuler *ruler)
+{
+ GtkWidget *widget;
+ GdkGC *gc, *bg_gc;
+ GdkFont *font;
+ gint i;
+ gint width, height;
+ gint xthickness;
+ gint ythickness;
+ gint pos;
+
+ g_return_if_fail (ruler != NULL);
+ g_return_if_fail (GTK_IS_HRULER (ruler));
+
+ if (!GTK_WIDGET_DRAWABLE (ruler))
+ return;
+
+ widget = GTK_WIDGET (ruler);
+
+ gc = widget->style->fg_gc[GTK_STATE_NORMAL];
+ bg_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
+ font = gtk_style_get_font(widget->style);
+
+ xthickness = widget->style->xthickness;
+ ythickness = widget->style->ythickness;
+
+ width = widget->allocation.width;
+ height = widget->allocation.height - ythickness * 2;
+
+ gtk_paint_box (widget->style, ruler->backing_store,
+ GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+ NULL, widget, "hruler",
+ 0, 0,
+ widget->allocation.width, widget->allocation.height);
+
+#if 0
+ gdk_draw_line (ruler->backing_store, gc,
+ xthickness,
+ height + ythickness,
+ widget->allocation.width - xthickness,
+ height + ythickness);
+#endif
+
+ /* assume ruler->max_size has the char width */
+ /* i is increment of char_width, pos is label number */
+ for ( i = 0, pos = 0; i < widget->allocation.width - xthickness; i += ruler->max_size, pos++ ) {
+ int length = ythickness / 2;
+
+ if ( pos % 10 == 0 ) length = ( 4 * ythickness );
+ else if (pos % 5 == 0 ) length = ( 2 * ythickness );
+
+ gdk_draw_line(ruler->backing_store, gc,
+ i, height + ythickness,
+ i, height - length);
+
+ if ( pos % 10 == 0 ) {
+ char buf[8];
+ /* draw label */
+ sprintf(buf, "%d", (int) pos);
+ gdk_draw_string(ruler->backing_store, font, gc,
+ i + 2, ythickness + font->ascent - 1,
+ buf);
+ }
+ }
+}
+
+/* gtk_ruler_set_pos() - does not work yet, need to reimplement
+ * gtk_ruler_draw_pos(). */
+void
+gtk_shruler_set_pos(GtkSHRuler * ruler, gfloat pos)
+{
+ GtkRuler * ruler_;
+ g_return_if_fail( ruler != NULL );
+
+ ruler_ = GTK_RULER(ruler);
+
+ if ( pos < ruler_->lower )
+ pos = ruler_->lower;
+ if ( pos > ruler_->upper )
+ pos = ruler_->upper;
+
+ ruler_->position = pos;
+
+ /* Make sure the ruler has been allocated already */
+ if ( ruler_->backing_store != NULL )
+ gtk_ruler_draw_pos(ruler_);
+}