gtkeditable.c 5.99 KB
Newer Older
1 2 3 4
/* GTK - The GIMP Toolkit
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
6 7 8 9 10 11
 * 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
12
 * Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
15 16 17
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
18
 */
19 20

/*
21
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22 23 24 25 26
 * file for a list of people on the GTK+ Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
 */

27
#include <config.h>
28
#include <string.h>
Owen Taylor's avatar
Owen Taylor committed
29

30
#include "gtkeditable.h"
31
#include "gtkmarshalers.h"
32
#include "gtkalias.h"
33

34 35 36 37

static void   gtk_editable_base_init             (gpointer g_class);


Manish Singh's avatar
Manish Singh committed
38
GType
39
gtk_editable_get_type (void)
40
{
Manish Singh's avatar
Manish Singh committed
41
  static GType editable_type = 0;
42 43 44

  if (!editable_type)
    {
Owen Taylor's avatar
Owen Taylor committed
45
      static const GTypeInfo editable_info =
46
      {
Owen Taylor's avatar
Owen Taylor committed
47
	sizeof (GtkEditableClass),  /* class_size */
48
	gtk_editable_base_init,	    /* base_init */
Owen Taylor's avatar
Owen Taylor committed
49
	NULL,			    /* base_finalize */
50 51
      };

52
      editable_type = g_type_register_static (G_TYPE_INTERFACE, g_intern_static_string ("GtkEditable"),
Manish Singh's avatar
Manish Singh committed
53
					      &editable_info, 0);
54 55 56 57 58
    }

  return editable_type;
}

59 60 61 62 63 64 65 66 67 68 69 70
static void
gtk_editable_base_init (gpointer g_class)
{
  static gboolean initialized = FALSE;

  if (! initialized)
    {
      g_signal_new ("insert_text",
		    GTK_TYPE_EDITABLE,
		    G_SIGNAL_RUN_LAST,
		    G_STRUCT_OFFSET (GtkEditableClass, insert_text),
		    NULL, NULL,
71
		    _gtk_marshal_VOID__STRING_INT_POINTER,
72
		    G_TYPE_NONE, 3,
Manish Singh's avatar
Manish Singh committed
73 74 75
		    G_TYPE_STRING,
		    G_TYPE_INT,
		    G_TYPE_POINTER);
76 77 78 79 80
      g_signal_new ("delete_text",
		    GTK_TYPE_EDITABLE,
		    G_SIGNAL_RUN_LAST,
		    G_STRUCT_OFFSET (GtkEditableClass, delete_text),
		    NULL, NULL,
81
		    _gtk_marshal_VOID__INT_INT,
Manish Singh's avatar
Manish Singh committed
82 83 84
		    G_TYPE_NONE, 2,
		    G_TYPE_INT,
		    G_TYPE_INT);
85 86 87 88 89
      g_signal_new ("changed",
		    GTK_TYPE_EDITABLE,
		    G_SIGNAL_RUN_LAST,
		    G_STRUCT_OFFSET (GtkEditableClass, changed),
		    NULL, NULL,
90
		    _gtk_marshal_VOID__VOID,
Manish Singh's avatar
Manish Singh committed
91
		    G_TYPE_NONE, 0);
92 93 94 95 96

      initialized = TRUE;
    }
}

97 98 99
void
gtk_editable_insert_text (GtkEditable *editable,
			  const gchar *new_text,
100 101
			  gint         new_text_length,
			  gint        *position)
102 103
{
  g_return_if_fail (GTK_IS_EDITABLE (editable));
Owen Taylor's avatar
Owen Taylor committed
104
  g_return_if_fail (position != NULL);
Owen Taylor's avatar
Owen Taylor committed
105

106 107 108
  if (new_text_length < 0)
    new_text_length = strlen (new_text);
  
109
  GTK_EDITABLE_GET_CLASS (editable)->do_insert_text (editable, new_text, new_text_length, position);
110 111 112 113
}

void
gtk_editable_delete_text (GtkEditable *editable,
114 115
			  gint         start_pos,
			  gint         end_pos)
116 117 118
{
  g_return_if_fail (GTK_IS_EDITABLE (editable));

119
  GTK_EDITABLE_GET_CLASS (editable)->do_delete_text (editable, start_pos, end_pos);
120 121 122
}

gchar *    
Owen Taylor's avatar
Owen Taylor committed
123 124 125
gtk_editable_get_chars (GtkEditable *editable,
			gint         start,
			gint         end)
126
{
127
  g_return_val_if_fail (GTK_IS_EDITABLE (editable), NULL);
128

Owen Taylor's avatar
Owen Taylor committed
129
  return GTK_EDITABLE_GET_CLASS (editable)->get_chars (editable, start, end);
130 131
}

Owen Taylor's avatar
Owen Taylor committed
132
void
Tim Janik's avatar
Tim Janik committed
133 134
gtk_editable_set_position (GtkEditable      *editable,
			   gint              position)
Owen Taylor's avatar
Owen Taylor committed
135 136 137
{
  g_return_if_fail (GTK_IS_EDITABLE (editable));

Owen Taylor's avatar
Owen Taylor committed
138
  GTK_EDITABLE_GET_CLASS (editable)->set_position (editable, position);
Owen Taylor's avatar
Owen Taylor committed
139 140 141 142 143
}

gint
gtk_editable_get_position (GtkEditable      *editable)
{
Owen Taylor's avatar
Owen Taylor committed
144
  g_return_val_if_fail (GTK_IS_EDITABLE (editable), 0);
Owen Taylor's avatar
Owen Taylor committed
145

Owen Taylor's avatar
Owen Taylor committed
146
  return GTK_EDITABLE_GET_CLASS (editable)->get_position (editable);
147 148
}

Owen Taylor's avatar
Owen Taylor committed
149 150 151 152
gboolean
gtk_editable_get_selection_bounds (GtkEditable *editable,
				   gint        *start_pos,
				   gint        *end_pos)
153
{
Owen Taylor's avatar
Owen Taylor committed
154 155
  gint tmp_start, tmp_end;
  gboolean result;
156
  
Owen Taylor's avatar
Owen Taylor committed
157
  g_return_val_if_fail (GTK_IS_EDITABLE (editable), FALSE);
158

Owen Taylor's avatar
Owen Taylor committed
159
  result = GTK_EDITABLE_GET_CLASS (editable)->get_selection_bounds (editable, &tmp_start, &tmp_end);
160

Owen Taylor's avatar
Owen Taylor committed
161 162 163 164
  if (start_pos)
    *start_pos = MIN (tmp_start, tmp_end);
  if (end_pos)
    *end_pos = MAX (tmp_start, tmp_end);
165

Owen Taylor's avatar
Owen Taylor committed
166
  return result;
167 168 169 170 171
}

void
gtk_editable_delete_selection (GtkEditable *editable)
{
Owen Taylor's avatar
Owen Taylor committed
172
  gint start, end;
173

174 175
  g_return_if_fail (GTK_IS_EDITABLE (editable));

Owen Taylor's avatar
Owen Taylor committed
176 177
  if (gtk_editable_get_selection_bounds (editable, &start, &end))
    gtk_editable_delete_text (editable, start, end);
178 179 180 181
}

void
gtk_editable_select_region (GtkEditable *editable,
182 183
			    gint         start,
			    gint         end)
184
{
185 186
  g_return_if_fail (GTK_IS_EDITABLE (editable));
  
Owen Taylor's avatar
Owen Taylor committed
187
  GTK_EDITABLE_GET_CLASS (editable)->set_selection_bounds (editable,  start, end);
188 189
}

190
void
191
gtk_editable_cut_clipboard (GtkEditable *editable)
192
{
193 194
  g_return_if_fail (GTK_IS_EDITABLE (editable));
  
Manish Singh's avatar
Manish Singh committed
195
  g_signal_emit_by_name (editable, "cut_clipboard");
196 197 198 199 200
}

void
gtk_editable_copy_clipboard (GtkEditable *editable)
{
201 202
  g_return_if_fail (GTK_IS_EDITABLE (editable));
  
Manish Singh's avatar
Manish Singh committed
203
  g_signal_emit_by_name (editable, "copy_clipboard");
204 205 206
}

void
207
gtk_editable_paste_clipboard (GtkEditable *editable)
208
{
209 210
  g_return_if_fail (GTK_IS_EDITABLE (editable));
  
Manish Singh's avatar
Manish Singh committed
211
  g_signal_emit_by_name (editable, "paste_clipboard");
212 213
}

214 215 216 217 218 219
void
gtk_editable_set_editable (GtkEditable    *editable,
			   gboolean        is_editable)
{
  g_return_if_fail (GTK_IS_EDITABLE (editable));

220
  g_object_set (editable,
Manish Singh's avatar
Manish Singh committed
221 222
		"editable", is_editable != FALSE,
		NULL);
223
}
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240

/**
 * gtk_editable_get_editable:
 * @editable: a #GtkEditable
 *
 * Retrieves whether @editable is editable. See
 * gtk_editable_set_editable().
 *
 * Return value: %TRUE if @editable is editable.
 **/
gboolean
gtk_editable_get_editable (GtkEditable *editable)
{
  gboolean value;

  g_return_val_if_fail (GTK_IS_EDITABLE (editable), FALSE);

241
  g_object_get (editable, "editable", &value, NULL);
242 243 244

  return value;
}
245 246 247

#define __GTK_EDITABLE_C__
#include "gtkaliasdef.c"