summaryrefslogtreecommitdiff
path: root/channel-buffer.c
blob: 5390439f3c159e7c61e74a3eecec246e4aac49e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * This data structure purpose in life is to maintain a GtkTextBuffer
 * with these properies: 
 *
 * - The channel is not editable:
 *
 * - There is an area after channel area where the user can enter new
 *   messages
 *
 * - You can add messages, and they will be displayed in gray in the
 *   channel area.
 *
 * - You can /commit/ messages which means they will turn black
 *
 * - Messages will be added to the channel area in the order they
 *   are committed
 *
 * - The user displays as either
 *
 *     - The users nickname, followed by a colon, followed by a space,
 *     followed by the text that the user has entered in a normal
 *     typeface
 *
 *   or
 * 
 *     - The users nickname in italic, followed by a apsce, followed
 *     by the text the user has entered, in italics
 *
 *  The first style is used for nomal messages, the second for
 *  'third person messages', ie.  'ssp thinks blah blah .... '
 *  as opposed to 'ssp: blaah blah blah'
 *
 * The channel buffer also maintains a topic 
 *
 */
#include "channel-buffer.h"

struct ChannelBuffer
{
    const char *user_nick;

    GtkTextBuffer *text_buffer;
    GtkTextTag *nick_tag;

    GtkTextMark *mid_point;
    GtkTextMark *nick_end;
};

static void
set_mid_point_gravity (ChannelBuffer *buffer,
		       gboolean       left_gravity)
{
    GtkTextIter iter;

    if (gtk_text_mark_get_left_gravity (buffer->mid_point) == left_gravity)
	return;
    
    gtk_text_buffer_get_iter_at_mark (buffer->text_buffer, &iter,
				      buffer->mid_point);
    gtk_text_buffer_delete_mark (buffer->text_buffer, buffer->midpoint);
    buffer->mid_point = gtk_text_buffer_create_mark (
	buffer->text_buffer, "mid_point", &iter, lelft_gravity);
}

static void
channel_buffer_change_nick_text (ChannelBuffer *buffer,
				 const char *text,
				 gboolean italic)
{
    
    gtk_text_buffer_insert (buffer->text_buffer, &iter,
			    buffer->user_nick, -1);
}

ChannelBuffer *
channel_buffer_new (const char *user_nick)
{
    ChannelBuffer *buffer = g_new (ChannelBuffer, 1);
    GtkTextIter iter;

    g_return_val_if_fail (g_utf8_validate (user_nick, -1, NULL), NULL);
    
    buffer->user_nick = g_strdup (user_nick);
    
    /* TextBuffer stuff */
    buffer->text_buffer = gtk_text_buffer_new (NULL);
    buffer->nick_tag =
	gtk_text_buffer_create_tag (buffer->text_buffer, "nick",
				    "weight", PANGO_WEIGHT_BOLD,
				    NULL);
    
    gtk_text_buffer_get_start_iter (buffer->text_buffer, &iter);
    
    buffer->mid_point = gtk_text_buffer_create_mark (
	buffer->text_buffer, "nick_begin", &iter, FALSE);

    buffer->nick_end = gtk_text_buffer_create_mark (
	buffer->text_buffer, "nick_end", &iter, TRUE);

    gtk_text_buffer_get_start_iter (buffer->text_buffer, &iter);
    
    buffer->channel_area_begin = gtk_text_buffer_create_mark (
	buffer->text_buffer, "channel_area_begin", &iter, TRUE);

    buffer->channel_area_end = gtk_text_buffer_create_mark (
	buffer->text_buffer, "channel_area_end", &iter, FALSE);

    return buffer;
}

void           channel_buffer_free            (ChannelBuffer *buffer);
ChannelMessage *channel_buffer_add_message     (ChannelBuffer *buffer,
						const char    *nick,
						const char    *message);
void		channel_buffer_commit_message (ChannelMessage *message);
void	       channel_buffer_set_user_nick   (ChannelBuffer *buffer,
					       const char    *nick);
const char *   channel_buffer_get_user_text   (ChannelBuffer *buffer);
void	       channel_buffer_set_action_mode (ChannelBuffer *buffer,
					       gboolean       action_mode);
gboolean       channel_buffer_get_action_mode (ChannelBuffer *buffer);
#if 0
void	       channel_buffer_set_topic	      (ChannelBuffer *buffer,
					       const char *topic);
const char *   channel_buffer_get_topic	      (ChannelBuffer *buffer);
#endif

GtkTextBuffer *
channel_buffer_get_text_buffer (ChannelBuffer *buffer)
{
    return buffer->text_buffer;
}