Interface Editable
- All Superinterfaces:
Proxy
- All Known Implementing Classes:
Editable.EditableImpl
,EditableLabel
,Entry
,EntryRow
,PasswordEntry
,PasswordEntryRow
,SearchEntry
,SpinButton
,SpinRow
,Text
GtkEditable
is an interface for text editing widgets.
Typical examples of editable widgets are Entry
and
SpinButton
. It contains functions for generically manipulating
an editable widget, a large number of action signals used for key bindings,
and several signals that an application can connect to modify the behavior
of a widget.
As an example of the latter usage, by connecting the following handler to
Gtk.Editable::insert-text
, an application can convert all entry
into a widget into uppercase.
Forcing entry to uppercase.
#include <ctype.h>
void
insert_text_handler (GtkEditable *editable,
const char *text,
int length,
int *position,
gpointer data)
{
char *result = g_utf8_strup (text, length);
g_signal_handlers_block_by_func (editable,
(gpointer) insert_text_handler, data);
gtk_editable_insert_text (editable, result, length, position);
g_signal_handlers_unblock_by_func (editable,
(gpointer) insert_text_handler, data);
g_signal_stop_emission_by_name (editable, "insert_text");
g_free (result);
}
Implementing GtkEditable
The most likely scenario for implementing GtkEditable
on your own widget
is that you will embed a GtkText
inside a complex widget, and want to
delegate the editable functionality to that text widget. GtkEditable
provides some utility functions to make this easy.
In your class_init function, call installProperties(org.gnome.gobject.GObject.ObjectClass, int)
,
passing the first available property ID:
static void
my_class_init (MyClass *class)
{
...
g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
gtk_editable_install_properties (object_clas, NUM_PROPERTIES);
...
}
In your interface_init function for the GtkEditable
interface, provide
an implementation for the get_delegate vfunc that returns your text widget:
GtkEditable *
get_editable_delegate (GtkEditable *editable)
{
return GTK_EDITABLE (MY_WIDGET (editable)->text_widget);
}
static void
my_editable_init (GtkEditableInterface *iface)
{
iface->get_delegate = get_editable_delegate;
}
You don't need to provide any other vfuncs. The default implementations work by forwarding to the delegate that the GtkEditableInterface.get_delegate() vfunc returns.
In your instance_init function, create your text widget, and then call
initDelegate()
:
static void
my_widget_init (MyWidget *self)
{
...
self->text_widget = gtk_text_new ();
gtk_editable_init_delegate (GTK_EDITABLE (self));
...
}
In your dispose function, call finishDelegate()
before
destroying your text widget:
static void
my_widget_dispose (GObject *object)
{
...
gtk_editable_finish_delegate (GTK_EDITABLE (self));
g_clear_pointer (&self->text_widget, gtk_widget_unparent);
...
}
Finally, use delegateSetProperty(org.gnome.gobject.GObject, int, org.gnome.gobject.Value, org.gnome.gobject.ParamSpec)
in your set_property
function (and similar for get_property
), to set the editable properties:
...
if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
return;
switch (prop_id)
...
It is important to note that if you create a GtkEditable
that uses
a delegate, the low level Gtk.Editable::insert-text
and
Gtk.Editable::delete-text
signals will be propagated from the
"wrapper" editable to the delegate, but they will not be propagated from
the delegate to the "wrapper" editable, as they would cause an infinite
recursion. If you wish to connect to the Gtk.Editable::insert-text
and Gtk.Editable::delete-text
signals, you will need to connect
to them on the delegate obtained via getDelegate()
.
-
Nested Class Summary
Modifier and TypeInterfaceDescriptionstatic interface
Editable.Builder<B extends Builder<B>>
static interface
Functional interface declaration of theChangedCallback
callback.static interface
Functional interface declaration of theDeleteTextCallback
callback.static class
The EditableImpl type represents a native instance of the Editable interface.static class
static interface
Functional interface declaration of theInsertTextCallback
callback. -
Method Summary
Modifier and TypeMethodDescriptiondefault boolean
Retrieves the accessible platform state from the editable delegate.static boolean
delegateGetProperty
(GObject object, int propId, Value value, ParamSpec pspec) Gets a property of theGtkEditable
delegate forobject
.static boolean
delegateSetProperty
(GObject object, int propId, Value value, ParamSpec pspec) Sets a property on theGtkEditable
delegate forobject
.default void
Deletes the currently selected text of the editable.default void
deleteText
(int startPos, int endPos) Deletes a sequence of characters.default void
Emits the "changed" signal.default void
emitDeleteText
(int startPos, int endPos) Emits the "delete-text" signal.default void
emitInsertText
(String text, int length, Out<Integer> position) Emits the "insert-text" signal.default void
Undoes the setup done byinitDelegate()
.default float
Gets the alignment of the editable.default String
getChars
(int startPos, int endPos) Retrieves a sequence of characters.default Editable
Gets theGtkEditable
that this Editable is delegating its implementation to.default boolean
Retrieves whether this Editable is editable.default boolean
Gets if undo/redo actions are enabled for this Editabledefault int
Retrieves the desired maximum width of this Editable, in characters.default int
Retrieves the current position of the cursor relative to the start of the content of the editable.default boolean
getSelectionBounds
(@Nullable Out<Integer> startPos, @Nullable Out<Integer> endPos) Retrieves the selection bound of the editable.default String
getText()
Retrieves the contents of this Editable.static Type
getType()
Get the GType of the Editable classdefault int
Gets the number of characters of space reserved for the contents of the editable.default void
Sets up a delegate forGtkEditable
.default void
insertText
(String text, int length, Out<Integer> position) Insertslength
bytes oftext
into the contents of the widget, at positionposition
.static int
installProperties
(GObject.ObjectClass objectClass, int firstProp) Overrides theGtkEditable
properties forclass_
.default SignalConnection
<Editable.ChangedCallback> onChanged
(Editable.ChangedCallback handler) Emitted at the end of a single user-visible operation on the contents.onDeleteText
(Editable.DeleteTextCallback handler) Emitted when text is deleted from the widget by the user.onInsertText
(Editable.InsertTextCallback handler) Emitted when text is inserted into the widget by the user.default void
selectRegion
(int startPos, int endPos) Selects a region of text.default void
setAlignment
(float xalign) Sets the alignment for the contents of the editable.default void
setEditable
(boolean isEditable) Determines if the user can edit the text in the editable widget.default void
setEnableUndo
(boolean enableUndo) If enabled, changes to this Editable will be saved for undo/redo actions.default void
setMaxWidthChars
(int nChars) Sets the desired maximum width in characters of this Editable.default void
setPosition
(int position) Sets the cursor position in the editable to the given value.default void
Sets the text in the editable to the given value.default void
setWidthChars
(int nChars) Changes the size request of the editable to be about the right size fornChars
characters.
-
Method Details
-
getType
-
delegateGetProperty
Gets a property of theGtkEditable
delegate forobject
.This is helper function that should be called in the
get_property
function of yourGtkEditable
implementation, before handling your own properties.- Parameters:
object
- aGObject
propId
- a property IDvalue
- value to setpspec
- theGParamSpec
for the property- Returns:
true
if the property was found
-
delegateSetProperty
Sets a property on theGtkEditable
delegate forobject
.This is a helper function that should be called in the
set_property
function of yourGtkEditable
implementation, before handling your own properties.- Parameters:
object
- aGObject
propId
- a property IDvalue
- value to setpspec
- theGParamSpec
for the property- Returns:
true
if the property was found
-
installProperties
Overrides theGtkEditable
properties forclass_
.This is a helper function that should be called in class_init, after installing your own properties.
Note that your class must have "text", "cursor-position", "selection-bound", "editable", "width-chars", "max-width-chars", "xalign" and "enable-undo" properties for this function to work.
To handle the properties in your set_property and get_property functions, you can either use
delegateSetProperty(org.gnome.gobject.GObject, int, org.gnome.gobject.Value, org.gnome.gobject.ParamSpec)
anddelegateGetProperty(org.gnome.gobject.GObject, int, org.gnome.gobject.Value, org.gnome.gobject.ParamSpec)
(if you are using a delegate), or remember thefirstProp
offset and add it to the values in theGtk.EditableProperties
enumeration to get the property IDs for these properties.- Parameters:
objectClass
- aGObjectClass
firstProp
- property ID to use for the first property- Returns:
- the number of properties that were installed
-
delegateGetAccessiblePlatformState
Retrieves the accessible platform state from the editable delegate.This is an helper function to retrieve the accessible state for
GtkEditable
interface implementations using a delegate pattern.You should call this function in your editable widget implementation of the
Accessible.getPlatformState(org.gnome.gtk.AccessiblePlatformState)
virtual function, for instance:static void accessible_interface_init (GtkAccessibleInterface *iface) { iface->get_platform_state = your_editable_get_accessible_platform_state; } static gboolean your_editable_get_accessible_platform_state (GtkAccessible *accessible, GtkAccessiblePlatformState state) { return gtk_editable_delegate_get_accessible_platform_state (GTK_EDITABLE (accessible), state); }
Note that the widget which is the delegate must be a direct child of this widget, otherwise your implementation of
Accessible.getPlatformState(org.gnome.gtk.AccessiblePlatformState)
might not even be called, as the platform change will originate from the parent of the delegate, and, as a result, will not work properly.So, if you can't ensure the direct child condition, you should give the delegate the
AccessibleRole.TEXT_BOX
role, or you can change your tree to allow this function to work.- Parameters:
state
- what kind of accessible state to retrieve- Returns:
- the accessible platform state of the delegate
-
deleteSelection
default void deleteSelection()Deletes the currently selected text of the editable.This call doesn’t do anything if there is no selected text.
-
deleteText
default void deleteText(int startPos, int endPos) Deletes a sequence of characters.The characters that are deleted are those characters at positions from
startPos
up to, but not includingendPos
. IfendPos
is negative, then the characters deleted are those fromstartPos
to the end of the text.Note that the positions are specified in characters, not bytes.
- Parameters:
startPos
- start positionendPos
- end position
-
finishDelegate
default void finishDelegate()Undoes the setup done byinitDelegate()
.This is a helper function that should be called from dispose, before removing the delegate object.
-
getAlignment
default float getAlignment()Gets the alignment of the editable.- Returns:
- the alignment
-
getChars
Retrieves a sequence of characters.The characters that are retrieved are those characters at positions from
startPos
up to, but not includingendPos
. IfendPos
is negative, then the characters retrieved are those characters fromstartPos
to the end of the text.Note that positions are specified in characters, not bytes.
- Parameters:
startPos
- start of textendPos
- end of text- Returns:
- a pointer to the contents of the widget as a
string. This string is allocated by the
GtkEditable
implementation and should be freed by the caller.
-
getDelegate
-
getEditable
default boolean getEditable()Retrieves whether this Editable is editable.- Returns:
true
if this Editable is editable.
-
getEnableUndo
default boolean getEnableUndo()Gets if undo/redo actions are enabled for this Editable- Returns:
true
if undo is enabled
-
getMaxWidthChars
default int getMaxWidthChars()Retrieves the desired maximum width of this Editable, in characters.- Returns:
- the maximum width of the entry, in characters
-
getPosition
default int getPosition()Retrieves the current position of the cursor relative to the start of the content of the editable.Note that this position is in characters, not in bytes.
- Returns:
- the cursor position
-
getSelectionBounds
default boolean getSelectionBounds(@Nullable @Nullable Out<Integer> startPos, @Nullable @Nullable Out<Integer> endPos) Retrieves the selection bound of the editable.startPos
will be filled with the start of the selection andendPos
with end. If no text was selected both will be identical andfalse
will be returned.Note that positions are specified in characters, not bytes.
- Parameters:
startPos
- location to store the starting positionendPos
- location to store the end position- Returns:
true
if there is a non-empty selection,false
otherwise
-
getText
Retrieves the contents of this Editable.The returned string is owned by GTK and must not be modified or freed.
- Returns:
- a pointer to the contents of the editable
-
getWidthChars
default int getWidthChars()Gets the number of characters of space reserved for the contents of the editable.- Returns:
- number of chars to request space for, or negative if unset
-
initDelegate
default void initDelegate()Sets up a delegate forGtkEditable
.This is assuming that the get_delegate vfunc in the
GtkEditable
interface has been set up for the this Editable's type.This is a helper function that should be called in instance init, after creating the delegate object.
-
insertText
Insertslength
bytes oftext
into the contents of the widget, at positionposition
.Note that the position is in characters, not in bytes. The function updates
position
to point after the newly inserted text.- Parameters:
text
- the text to insertlength
- the length of the text in bytes, or -1position
- location of the position text will be inserted at
-
selectRegion
default void selectRegion(int startPos, int endPos) Selects a region of text.The characters that are selected are those characters at positions from
startPos
up to, but not includingendPos
. IfendPos
is negative, then the characters selected are those characters fromstartPos
to the end of the text.Note that positions are specified in characters, not bytes.
- Parameters:
startPos
- start of regionendPos
- end of region
-
setAlignment
default void setAlignment(float xalign) Sets the alignment for the contents of the editable.This controls the horizontal positioning of the contents when the displayed text is shorter than the width of the editable.
- Parameters:
xalign
- The horizontal alignment, from 0 (left) to 1 (right). Reversed for RTL layouts
-
setEditable
default void setEditable(boolean isEditable) Determines if the user can edit the text in the editable widget.- Parameters:
isEditable
-true
if the user is allowed to edit the text in the widget
-
setEnableUndo
default void setEnableUndo(boolean enableUndo) If enabled, changes to this Editable will be saved for undo/redo actions.This results in an additional copy of text changes and are not stored in secure memory. As such, undo is forcefully disabled when
Gtk.Text:visibility
is set tofalse
.- Parameters:
enableUndo
- if undo/redo should be enabled
-
setMaxWidthChars
default void setMaxWidthChars(int nChars) Sets the desired maximum width in characters of this Editable.- Parameters:
nChars
- the new desired maximum width, in characters
-
setPosition
default void setPosition(int position) Sets the cursor position in the editable to the given value.The cursor is displayed before the character with the given (base 0) index in the contents of the editable. The value must be less than or equal to the number of characters in the editable. A value of -1 indicates that the position should be set after the last character of the editable. Note that
position
is in characters, not in bytes.- Parameters:
position
- the position of the cursor
-
setText
Sets the text in the editable to the given value.This is replacing the current contents.
- Parameters:
text
- the text to set
-
setWidthChars
default void setWidthChars(int nChars) Changes the size request of the editable to be about the right size fornChars
characters.Note that it changes the size request, the size can still be affected by how you pack the widget into containers. If
nChars
is -1, the size reverts to the default size.- Parameters:
nChars
- width in chars
-
onChanged
Emitted at the end of a single user-visible operation on the contents.E.g., a paste operation that replaces the contents of the selection will cause only one signal emission (even though it is implemented by first deleting the selection, then inserting the new content, and may cause multiple ::notify::text signals to be emitted).
- Parameters:
handler
- the signal handler- Returns:
- a signal handler ID to keep track of the signal connection
- See Also:
-
emitChanged
default void emitChanged()Emits the "changed" signal. SeeonChanged(org.gnome.gtk.Editable.ChangedCallback)
. -
onDeleteText
default SignalConnection<Editable.DeleteTextCallback> onDeleteText(Editable.DeleteTextCallback handler) Emitted when text is deleted from the widget by the user.The default handler for this signal will normally be responsible for deleting the text, so by connecting to this signal and then stopping the signal with g_signal_stop_emission(), it is possible to modify the range of deleted text, or prevent it from being deleted entirely.
The
startPos
andendPos
parameters are interpreted as fordeleteText(int, int)
.- Parameters:
handler
- the signal handler- Returns:
- a signal handler ID to keep track of the signal connection
- See Also:
-
emitDeleteText
default void emitDeleteText(int startPos, int endPos) Emits the "delete-text" signal. SeeonDeleteText(org.gnome.gtk.Editable.DeleteTextCallback)
. -
onInsertText
default SignalConnection<Editable.InsertTextCallback> onInsertText(Editable.InsertTextCallback handler) Emitted when text is inserted into the widget by the user.The default handler for this signal will normally be responsible for inserting the text, so by connecting to this signal and then stopping the signal with g_signal_stop_emission(), it is possible to modify the inserted text, or prevent it from being inserted entirely.
- Parameters:
handler
- the signal handler- Returns:
- a signal handler ID to keep track of the signal connection
- See Also:
-
emitInsertText
Emits the "insert-text" signal. SeeonInsertText(org.gnome.gtk.Editable.InsertTextCallback)
.
-