2 * This file is a part of hildon
4 * Copyright (C) 2008, 2009 Nokia Corporation, all rights reserved.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser Public License as published by
8 * the Free Software Foundation; version 2 of the license.
10 * This program 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
13 * GNU Lesser Public License for more details.
18 * SECTION:hildon-text-view
19 * @short_description: Text view within the Hildon framework.
21 * #HildonTextView is a text view derived from the #GtkTextView widget
22 * but with a slightly different appearance designed for the Hildon
25 * Text views in Hildon 2.2 can have a placeholder text, set with
26 * hildon_gtk_text_view_set_placeholder_text(). This text will be
27 * shown if the text view is empty and doesn't have the input focus,
28 * but it's otherwise ignored. Thus, calls to
29 * gtk_text_view_get_buffer() will never return the placeholder text,
30 * not even when it's being displayed.
33 * <title>Creating a HildonTextView with a placeholder</title>
36 * create_text_view (void)
38 * GtkWidget *text_view;
40 * text_view = hildon_text_view_new ();
41 * hildon_gtk_text_view_set_placeholder_text (GTK_TEXT_VIEW (text_view),
42 * "Type some text here");
50 #undef HILDON_DISABLE_DEPRECATED
52 #include "hildon-text-view.h"
55 #define HILDON_TEXT_VIEW_DRAG_THRESHOLD 16.0
57 G_DEFINE_TYPE (HildonTextView, hildon_text_view, GTK_TYPE_TEXT_VIEW);
59 #define HILDON_TEXT_VIEW_GET_PRIVATE(obj) \
60 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
61 HILDON_TYPE_TEXT_VIEW, HildonTextViewPrivate));
63 typedef struct _HildonTextViewPrivate HildonTextViewPrivate;
65 struct _HildonTextViewPrivate
67 gdouble x; /* tap x position */
68 gdouble y; /* tap y position */
73 * hildon_text_view_set_buffer:
74 * @text_view: a #HildonTextView
75 * @buffer: a #GtkTextBuffer
77 * Sets @buffer as the buffer being displayed by @text_view. The
78 * previous buffer displayed by the text view is unreferenced, and a
79 * reference is added to @buffer. If you owned a reference to @buffer
80 * before passing it to this function, you must remove that reference
85 * Deprecated: use gtk_text_view_set_buffer() instead
88 hildon_text_view_set_buffer (HildonTextView *text_view,
89 GtkTextBuffer *buffer)
91 g_return_if_fail (HILDON_IS_TEXT_VIEW (text_view));
92 g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
93 gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), buffer);
97 * hildon_text_view_get_buffer:
98 * @text_view: a #HildonTextView
100 * Returns the text buffer in @text_view. The reference count is not
101 * incremented; the caller of this function won't own a new reference.
103 * Note that the placeholder text (set using
104 * hildon_gtk_text_view_set_placeholder_text()) is never contained in
107 * Returns: a #GtkTextBuffer
111 * Deprecated: use gtk_text_view_get_buffer() instead
114 hildon_text_view_get_buffer (HildonTextView *text_view)
116 g_return_val_if_fail (HILDON_IS_TEXT_VIEW (text_view), NULL);
117 return gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
121 * hildon_text_view_set_placeholder:
122 * @text_view: a #HildonTextView
123 * @text: the new text
125 * Sets the placeholder text in @text_view to @text.
129 * Deprecated: use hildon_gtk_text_view_set_placeholder_text() instead
132 hildon_text_view_set_placeholder (HildonTextView *text_view,
135 g_return_if_fail (HILDON_IS_TEXT_VIEW (text_view) && text != NULL);
136 hildon_gtk_text_view_set_placeholder_text (GTK_TEXT_VIEW (text_view), text);
140 * hildon_text_view_new:
142 * Creates a new text view.
144 * Returns: a new #HildonTextView
149 hildon_text_view_new (void)
151 GtkWidget *entry = g_object_new (HILDON_TYPE_TEXT_VIEW, NULL);
157 hildon_text_view_button_press_event (GtkWidget *widget,
158 GdkEventButton *event)
160 HildonTextViewPrivate *priv = HILDON_TEXT_VIEW_GET_PRIVATE (widget);
162 gtk_widget_grab_focus (widget);
164 if (GTK_TEXT_VIEW (widget)->editable &&
165 hildon_gtk_im_context_filter_event (GTK_TEXT_VIEW (widget)->im_context, (GdkEvent*)event)) {
166 GTK_TEXT_VIEW (widget)->need_im_reset = TRUE;
170 if (event->button == 1 && event->type == GDK_BUTTON_PRESS) {
181 hildon_text_view_button_release_event (GtkWidget *widget,
182 GdkEventButton *event)
184 GtkTextView *text_view = GTK_TEXT_VIEW (widget);
185 HildonTextViewPrivate *priv = HILDON_TEXT_VIEW_GET_PRIVATE (widget);
189 if (text_view->editable &&
190 hildon_gtk_im_context_filter_event (text_view->im_context, (GdkEvent*)event)) {
191 text_view->need_im_reset = TRUE;
195 if (event->button == 1 && event->type == GDK_BUTTON_RELEASE) {
196 if (fabs (priv->x - event->x) < HILDON_TEXT_VIEW_DRAG_THRESHOLD &&
197 fabs (priv->y - event->y) < HILDON_TEXT_VIEW_DRAG_THRESHOLD) {
198 GtkTextWindowType window_type;
199 GtkTextBuffer *buffer;
201 window_type = gtk_text_view_get_window_type (text_view, event->window);
202 gtk_text_view_window_to_buffer_coords (text_view,
206 gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
207 buffer = gtk_text_view_get_buffer (text_view);
208 if (gtk_text_buffer_get_char_count (buffer))
209 gtk_text_buffer_place_cursor (buffer, &iter);
211 gtk_widget_grab_focus (GTK_WIDGET (text_view));
220 hildon_text_view_class_init (HildonTextViewClass *klass)
222 GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
224 widget_class->motion_notify_event = NULL;
225 widget_class->button_press_event = hildon_text_view_button_press_event;
226 widget_class->button_release_event = hildon_text_view_button_release_event;
228 g_type_class_add_private (klass, sizeof (HildonTextViewPrivate));
231 hildon_text_view_init (HildonTextView *self)