Mercurial > pidgin.yaz
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 |