Interface Editable
- All Superinterfaces:
Proxy
- All Known Implementing Classes:
Editable.Editable$Impl,EditableLabel,Entry,EntryRow,PasswordEntry,PasswordEntryRow,SearchEntry,SpinButton,SpinRow,Text
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
Nested ClassesModifier and TypeInterfaceDescriptionstatic interfaceEditable.Builder<B extends Builder<B>>static interfaceFunctional interface declaration of theChangedCallbackcallback.static interfaceFunctional interface declaration of theDeleteTextCallbackcallback.static classThe Editable$Impl type represents a native instance of the Editable interface.static classstatic interfaceFunctional interface declaration of theInsertTextCallbackcallback. -
Method Summary
Modifier and TypeMethodDescriptiondefault booleanRetrieves the accessible platform state from the editable delegate.static booleandelegateGetProperty(GObject object, int propId, Value value, ParamSpec pspec) Gets a property of theGtkEditabledelegate forobject.static booleandelegateSetProperty(GObject object, int propId, Value value, ParamSpec pspec) Sets a property on theGtkEditabledelegate forobject.default voidDeletes the currently selected text of the editable.default voiddeleteText(int startPos, int endPos) Deletes a sequence of characters.default voidEmits the "changed" signal.default voidemitDeleteText(int startPos, int endPos) Emits the "delete-text" signal.default voidemitInsertText(String text, int length, Out<Integer> position) Emits the "insert-text" signal.default voidUndoes the setup done byinitDelegate().default floatGets the alignment of the editable.default StringgetChars(int startPos, int endPos) Retrieves a sequence of characters.default @Nullable EditableGets theGtkEditablethat this Editable is delegating its implementation to.default booleanRetrieves whether this Editable is editable.default booleanGets if undo/redo actions are enabled for this Editabledefault intRetrieves the desired maximum width ofeditable,in characters.default intRetrieves the current position of the cursor relative to the start of the content of the editable.default booleangetSelectionBounds(@Nullable Out<Integer> startPos, @Nullable Out<Integer> endPos) Retrieves the selection bound of the editable.default StringgetText()Retrieves the contents ofeditable.static @Nullable TypegetType()Get the GType of the Editable classdefault intGets the number of characters of space reserved for the contents of the editable.default voidSets up a delegate forGtkEditable.default voidinsertText(String text, int length, Out<Integer> position) Insertslengthbytes oftextinto the contents of the widget, at positionposition.static intinstallProperties(GObject.ObjectClass objectClass, int firstProp) Overrides theGtkEditableproperties 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 voidselectRegion(int startPos, int endPos) Selects a region of text.default voidsetAlignment(float xalign) Sets the alignment for the contents of the editable.default voidsetEditable(boolean isEditable) Determines if the user can edit the text in the editable widget.default voidsetEnableUndo(boolean enableUndo) If enabled, changes to this Editable will be saved for undo/redo actions.default voidsetMaxWidthChars(int nChars) Sets the desired maximum width in characters ofeditable.default voidsetPosition(int position) Sets the cursor position in the editable to the given value.default voidSets the text in the editable to the given value.default voidsetWidthChars(int nChars) Changes the size request of the editable to be about the right size fornCharscharacters.
-
Method Details
-
getType
-
delegateGetProperty
Gets a property of theGtkEditabledelegate forobject.This is helper function that should be called in the
get_propertyfunction of yourGtkEditableimplementation, before handling your own properties.- Parameters:
object- aGObjectpropId- a property IDvalue- value to setpspec- theGParamSpecfor the property- Returns:
trueif the property was found
-
delegateSetProperty
Sets a property on theGtkEditabledelegate forobject.This is a helper function that should be called in the
set_propertyfunction of yourGtkEditableimplementation, before handling your own properties.- Parameters:
object- aGObjectpropId- a property IDvalue- value to setpspec- theGParamSpecfor the property- Returns:
trueif the property was found
-
installProperties
Overrides theGtkEditableproperties 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 thefirstPropoffset and add it to the values in theGtk.EditablePropertiesenumeration to get the property IDs for these properties.- Parameters:
objectClass- aGObjectClassfirstProp- 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
GtkEditableinterface 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_BOXrole, 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
- Since:
- 4.10
-
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
startPosup to, but not includingendPos.IfendPosis negative, then the characters deleted are those fromstartPosto 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
startPosup to, but not includingendPos.IfendPosis negative, then the characters retrieved are those characters fromstartPosto 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
GtkEditableimplementation and should be freed by the caller.
-
getDelegate
-
getEditable
default boolean getEditable()Retrieves whether this Editable is editable.- Returns:
trueif this Editable is editable.
-
getEnableUndo
default boolean getEnableUndo()Gets if undo/redo actions are enabled for this Editable- Returns:
trueif undo is enabled
-
getMaxWidthChars
default int getMaxWidthChars()Retrieves the desired maximum width ofeditable,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
Retrieves the selection bound of the editable.startPoswill be filled with the start of the selection andendPoswith end. If no text was selected both will be identical andfalsewill 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:
trueif there is a non-empty selection,falseotherwise
-
getText
Retrieves the contents ofeditable.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
GtkEditableinterface has been set up for theeditable'stype.This is a helper function that should be called in instance init, after creating the delegate object.
-
insertText
Insertslengthbytes oftextinto the contents of the widget, at positionposition.Note that the position is in characters, not in bytes. The function updates
positionto 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
startPosup to, but not includingendPos.IfendPosis negative, then the characters selected are those characters fromstartPosto 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-trueif 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:visibilityis set tofalse.- Parameters:
enableUndo- if undo/redo should be enabled
-
setMaxWidthChars
default void setMaxWidthChars(int nChars) Sets the desired maximum width in characters ofeditable.- 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
positionis 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 fornCharscharacters.Note that it changes the size request, the size can still be affected by how you pack the widget into containers. If
nCharsis -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
startPosandendPosparameters 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).
-