comparison console/libgnt/gnttextview.c @ 13882:5c750626eaa5

[gaim-migrate @ 16362] New widget GntTextView. It's really simple as it is. But it 'works'. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Wed, 28 Jun 2006 00:17:35 +0000
parents
children 9d66969a2e32
comparison
equal deleted inserted replaced
13881:5d5e249c488e 13882:5c750626eaa5
1 #include "gnttextview.h"
2
3 enum
4 {
5 SIGS = 1,
6 };
7
8 static GntWidgetClass *parent_class = NULL;
9 static guint signals[SIGS] = { 0 };
10
11 static void
12 gnt_text_view_draw(GntWidget *widget)
13 {
14 GntTextView *view = GNT_TEXT_VIEW(widget);
15
16 copywin(view->scroll, widget->window, view->pos, 0, 0, 0,
17 widget->priv.height - 1, widget->priv.width - 1, FALSE);
18
19 DEBUG;
20 }
21
22 static void
23 gnt_text_view_size_request(GntWidget *widget)
24 {
25 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))
26 {
27 gnt_widget_set_size(widget, 64, 24);
28 }
29 }
30
31 static void
32 gnt_text_view_map(GntWidget *widget)
33 {
34 if (widget->priv.width == 0 || widget->priv.height == 0)
35 gnt_widget_size_request(widget);
36 DEBUG;
37 }
38
39 static gboolean
40 gnt_text_view_key_pressed(GntWidget *widget, const char *text)
41 {
42 return FALSE;
43 }
44
45 static void
46 gnt_text_view_destroy(GntWidget *widget)
47 {
48 }
49
50 static void
51 gnt_text_view_class_init(GntTextViewClass *klass)
52 {
53 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
54
55 parent_class = GNT_WIDGET_CLASS(klass);
56 parent_class->destroy = gnt_text_view_destroy;
57 parent_class->draw = gnt_text_view_draw;
58 parent_class->map = gnt_text_view_map;
59 parent_class->size_request = gnt_text_view_size_request;
60 parent_class->key_pressed = gnt_text_view_key_pressed;
61
62 DEBUG;
63 }
64
65 static void
66 gnt_text_view_init(GTypeInstance *instance, gpointer class)
67 {
68 DEBUG;
69 }
70
71 /******************************************************************************
72 * GntTextView API
73 *****************************************************************************/
74 GType
75 gnt_text_view_get_gtype(void)
76 {
77 static GType type = 0;
78
79 if(type == 0)
80 {
81 static const GTypeInfo info = {
82 sizeof(GntTextViewClass),
83 NULL, /* base_init */
84 NULL, /* base_finalize */
85 (GClassInitFunc)gnt_text_view_class_init,
86 NULL, /* class_finalize */
87 NULL, /* class_data */
88 sizeof(GntTextView),
89 0, /* n_preallocs */
90 gnt_text_view_init, /* instance_init */
91 };
92
93 type = g_type_register_static(GNT_TYPE_WIDGET,
94 "GntTextView",
95 &info, 0);
96 }
97
98 return type;
99 }
100
101 GntWidget *gnt_text_view_new()
102 {
103 GntWidget *widget = g_object_new(GNT_TYPE_TEXTVIEW, NULL);
104 GntTextView *view = GNT_TEXT_VIEW(widget);
105
106 view->scroll = newwin(255, widget->priv.width, widget->priv.y, widget->priv.x);
107 scrollok(view->scroll, TRUE);
108 wsetscrreg(view->scroll, 0, 254);
109 wbkgd(view->scroll, COLOR_PAIR(GNT_COLOR_NORMAL));
110 werase(view->scroll);
111 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER);
112
113 return widget;
114 }
115
116 void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextViewFlags flags)
117 {
118 GntWidget *widget = GNT_WIDGET(view);
119 int fl = 0;
120 char **split;
121 int i;
122
123 if (text == NULL || *text == '\0')
124 return;
125
126 if (flags & GNT_TEXT_FLAG_BOLD)
127 fl |= A_BOLD;
128 if (flags & GNT_TEXT_FLAG_UNDERLINE)
129 fl |= A_UNDERLINE;
130 if (flags & GNT_TEXT_FLAG_BLINK)
131 fl |= A_BLINK;
132
133 wattrset(view->scroll, fl | COLOR_PAIR(GNT_COLOR_NORMAL));
134
135 split = g_strsplit(text, "\n", 0);
136 for (i = 0; split[i + 1]; i++)
137 {
138 /* XXX: Do something if the strlen of split[i] is big
139 * enough to cause the text to wrap. */
140 wprintw(view->scroll, "%s\n", split[i]);
141 view->lines++;
142 }
143 wprintw(view->scroll, "%s", split[i]);
144 g_strfreev(split);
145
146 gnt_widget_draw(widget);
147 }
148
149 void gnt_text_view_scroll(GntTextView *view, int scroll)
150 {
151 GntWidget *widget = GNT_WIDGET(view);
152 int height;
153
154 if (scroll == 0)
155 {
156 view->pos = view->lines - widget->priv.height + 1;
157 }
158 else
159 {
160 view->pos += scroll;
161 }
162
163 if (view->pos + (height = widget->priv.height) > view->lines)
164 view->pos = view->lines - height + 1;
165
166 if (view->pos < 0)
167 view->pos = 0;
168
169 gnt_widget_draw(GNT_WIDGET(view));
170 }
171
172 void gnt_text_view_next_line(GntTextView *view)
173 {
174 wclrtoeol(view->scroll);
175 gnt_text_view_append_text_with_flags(view, "\n", 0);
176 }
177