]> uap-core.de Git - rssreader.git/commitdiff
add text widgets
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 13 Jul 2025 17:23:13 +0000 (19:23 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 13 Jul 2025 17:23:13 +0000 (19:23 +0200)
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java
ui-java/src/main/java/de/unixwork/ui/Text.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/TextAreaBuilder.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/TextFieldBuilder.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/TextFuncs.java [new file with mode: 0644]

index e9a6d80fc44c83a8edd23e753b66dd02f3acd23a..d4d664784592f9e559ddb9d5cf3fb26fd9367863 100644 (file)
@@ -203,6 +203,44 @@ class ArgFuncs {
     MethodHandle sourcelist_args_set_onbuttonclickdata;
     MethodHandle sourcelist_args_free;
 
+    MethodHandle textarea_args_new;
+    MethodHandle textarea_args_set_fill;
+    MethodHandle textarea_args_set_hexpand;
+    MethodHandle textarea_args_set_vexpand;
+    MethodHandle textarea_args_set_hfill;
+    MethodHandle textarea_args_set_vfill;
+    MethodHandle textarea_args_set_override_defaults;
+    MethodHandle textarea_args_set_colspan;
+    MethodHandle textarea_args_set_rowspan;
+    MethodHandle textarea_args_set_name;
+    MethodHandle textarea_args_set_style_class;
+    MethodHandle textarea_args_set_varname;
+    MethodHandle textarea_args_set_value;
+    MethodHandle textarea_args_set_onchange;
+    MethodHandle textarea_args_set_onchangedata;
+    MethodHandle textarea_args_set_groups;
+    MethodHandle textarea_args_free;
+
+    MethodHandle textfield_args_new;
+    MethodHandle textfield_args_set_fill;
+    MethodHandle textfield_args_set_hexpand;
+    MethodHandle textfield_args_set_vexpand;
+    MethodHandle textfield_args_set_hfill;
+    MethodHandle textfield_args_set_vfill;
+    MethodHandle textfield_args_set_override_defaults;
+    MethodHandle textfield_args_set_colspan;
+    MethodHandle textfield_args_set_rowspan;
+    MethodHandle textfield_args_set_name;
+    MethodHandle textfield_args_set_style_class;
+    MethodHandle textfield_args_set_varname;
+    MethodHandle textfield_args_set_value;
+    MethodHandle textfield_args_set_onchange;
+    MethodHandle textfield_args_set_onchangedata;
+    MethodHandle textfield_args_set_onactivate;
+    MethodHandle textfield_args_set_onactivatedata;
+    MethodHandle textfield_args_set_groups;
+    MethodHandle textfield_args_free;
+
     private ArgFuncs(Linker linker, SymbolLookup lib) {
         FunctionDescriptor sigm = FunctionDescriptor.of(ValueLayout.ADDRESS);
         FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS);
@@ -408,6 +446,44 @@ class ArgFuncs {
         MemorySegment ui_sourcelist_args_set_onbuttonclickdata_addr = lib.find("ui_sourcelist_args_set_onbuttonclickdata").orElseThrow();
         MemorySegment ui_sourcelist_args_free_addr = lib.find("ui_sourcelist_args_free").orElseThrow();
 
+        MemorySegment ui_textarea_args_new_addr = lib.find("ui_textarea_args_new").orElseThrow();
+        MemorySegment ui_textarea_args_set_fill_addr = lib.find("ui_textarea_args_set_fill").orElseThrow();
+        MemorySegment ui_textarea_args_set_hexpand_addr = lib.find("ui_textarea_args_set_hexpand").orElseThrow();
+        MemorySegment ui_textarea_args_set_vexpand_addr = lib.find("ui_textarea_args_set_vexpand").orElseThrow();
+        MemorySegment ui_textarea_args_set_hfill_addr = lib.find("ui_textarea_args_set_hfill").orElseThrow();
+        MemorySegment ui_textarea_args_set_vfill_addr = lib.find("ui_textarea_args_set_vfill").orElseThrow();
+        MemorySegment ui_textarea_args_set_override_defaults_addr = lib.find("ui_textarea_args_set_override_defaults").orElseThrow();
+        MemorySegment ui_textarea_args_set_colspan_addr = lib.find("ui_textarea_args_set_colspan").orElseThrow();
+        MemorySegment ui_textarea_args_set_rowspan_addr = lib.find("ui_textarea_args_set_rowspan").orElseThrow();
+        MemorySegment ui_textarea_args_set_name_addr = lib.find("ui_textarea_args_set_name").orElseThrow();
+        MemorySegment ui_textarea_args_set_style_class_addr = lib.find("ui_textarea_args_set_style_class").orElseThrow();
+        MemorySegment ui_textarea_args_set_varname_addr = lib.find("ui_textarea_args_set_varname").orElseThrow();
+        MemorySegment ui_textarea_args_set_value_addr = lib.find("ui_textarea_args_set_value").orElseThrow();
+        MemorySegment ui_textarea_args_set_onchange_addr = lib.find("ui_textarea_args_set_onchange").orElseThrow();
+        MemorySegment ui_textarea_args_set_onchangedata_addr = lib.find("ui_textarea_args_set_onchangedata").orElseThrow();
+        MemorySegment ui_textarea_args_set_groups_addr = lib.find("ui_textarea_args_set_groups").orElseThrow();
+        MemorySegment ui_textarea_args_free_addr = lib.find("ui_textarea_args_free").orElseThrow();
+
+        MemorySegment ui_textfield_args_new_addr = lib.find("ui_textfield_args_new").orElseThrow();
+        MemorySegment ui_textfield_args_set_fill_addr = lib.find("ui_textfield_args_set_fill").orElseThrow();
+        MemorySegment ui_textfield_args_set_hexpand_addr = lib.find("ui_textfield_args_set_hexpand").orElseThrow();
+        MemorySegment ui_textfield_args_set_vexpand_addr = lib.find("ui_textfield_args_set_vexpand").orElseThrow();
+        MemorySegment ui_textfield_args_set_hfill_addr = lib.find("ui_textfield_args_set_hfill").orElseThrow();
+        MemorySegment ui_textfield_args_set_vfill_addr = lib.find("ui_textfield_args_set_vfill").orElseThrow();
+        MemorySegment ui_textfield_args_set_override_defaults_addr = lib.find("ui_textfield_args_set_override_defaults").orElseThrow();
+        MemorySegment ui_textfield_args_set_colspan_addr = lib.find("ui_textfield_args_set_colspan").orElseThrow();
+        MemorySegment ui_textfield_args_set_rowspan_addr = lib.find("ui_textfield_args_set_rowspan").orElseThrow();
+        MemorySegment ui_textfield_args_set_name_addr = lib.find("ui_textfield_args_set_name").orElseThrow();
+        MemorySegment ui_textfield_args_set_style_class_addr = lib.find("ui_textfield_args_set_style_class").orElseThrow();
+        MemorySegment ui_textfield_args_set_varname_addr = lib.find("ui_textfield_args_set_varname").orElseThrow();
+        MemorySegment ui_textfield_args_set_value_addr = lib.find("ui_textfield_args_set_value").orElseThrow();
+        MemorySegment ui_textfield_args_set_onchange_addr = lib.find("ui_textfield_args_set_onchange").orElseThrow();
+        MemorySegment ui_textfield_args_set_onchangedata_addr = lib.find("ui_textfield_args_set_onchangedata").orElseThrow();
+        MemorySegment ui_textfield_args_set_onactivate_addr = lib.find("ui_textfield_args_set_onactivate").orElseThrow();
+        MemorySegment ui_textfield_args_set_onactivatedata_addr = lib.find("ui_textfield_args_set_onactivatedata").orElseThrow();
+        MemorySegment ui_textfield_args_set_groups_addr = lib.find("ui_textfield_args_set_groups").orElseThrow();
+        MemorySegment ui_textfield_args_free_addr = lib.find("ui_textfield_^args_free").orElseThrow();
+
         menuitem_args_new = linker.downcallHandle(ui_menuitem_args_new_addr, sigm);
         menuitem_args_set_label = linker.downcallHandle(ui_menuitem_args_set_label_addr, sigv_mm);
         menuitem_args_set_stockid = linker.downcallHandle(ui_menuitem_args_set_stockid_addr, sigv_mm);
@@ -604,6 +680,44 @@ class ArgFuncs {
         sourcelist_args_set_onbuttonclick = linker.downcallHandle(ui_sourcelist_args_set_onbuttonclick_addr, sigv_mm);
         sourcelist_args_set_onbuttonclickdata = linker.downcallHandle(ui_sourcelist_args_set_onbuttonclickdata_addr, sigv_mm);
         sourcelist_args_free = linker.downcallHandle(ui_sourcelist_args_free_addr, sigv_m);
+
+        textarea_args_new = linker.downcallHandle(ui_textarea_args_new_addr, sigm);
+        textarea_args_set_fill = linker.downcallHandle(ui_textarea_args_set_fill_addr, sigm);
+        textarea_args_set_hexpand = linker.downcallHandle(ui_textarea_args_set_hexpand_addr, sigv_mb);
+        textarea_args_set_vexpand = linker.downcallHandle(ui_textarea_args_set_vexpand_addr, sigv_mb);
+        textarea_args_set_hfill = linker.downcallHandle(ui_textarea_args_set_hfill_addr, sigv_mb);
+        textarea_args_set_vfill = linker.downcallHandle(ui_textarea_args_set_vfill_addr, sigv_mb);
+        textarea_args_set_override_defaults = linker.downcallHandle(ui_textarea_args_set_override_defaults_addr, sigv_mb);
+        textarea_args_set_colspan = linker.downcallHandle(ui_textarea_args_set_colspan_addr, sigv_mi);
+        textarea_args_set_rowspan = linker.downcallHandle(ui_textarea_args_set_rowspan_addr, sigv_mi);
+        textarea_args_set_name = linker.downcallHandle(ui_textarea_args_set_name_addr, sigv_mm);
+        textarea_args_set_style_class = linker.downcallHandle(ui_textarea_args_set_style_class_addr, sigv_mm);
+        textarea_args_set_varname = linker.downcallHandle(ui_textarea_args_set_varname_addr, sigv_mm);
+        textarea_args_set_value = linker.downcallHandle(ui_textarea_args_set_value_addr, sigv_mm);
+        textarea_args_set_onchange = linker.downcallHandle(ui_textarea_args_set_onchange_addr, sigv_mm);
+        textarea_args_set_onchangedata = linker.downcallHandle(ui_textarea_args_set_onchangedata_addr, sigv_mm);
+        textarea_args_set_groups = linker.downcallHandle(ui_textarea_args_set_groups_addr, sigv_mm);
+        textarea_args_free = linker.downcallHandle(ui_textarea_args_free_addr, sigv_m);
+
+        textfield_args_new = linker.downcallHandle(ui_textfield_args_new_addr, sigm);
+        textfield_args_set_fill = linker.downcallHandle(ui_textfield_args_set_fill_addr, sigm);
+        textfield_args_set_hexpand = linker.downcallHandle(ui_textfield_args_set_hexpand_addr, sigv_mb);
+        textfield_args_set_vexpand = linker.downcallHandle(ui_textfield_args_set_vexpand_addr, sigv_mb);
+        textfield_args_set_hfill = linker.downcallHandle(ui_textfield_args_set_hfill_addr, sigv_mb);
+        textfield_args_set_vfill = linker.downcallHandle(ui_textfield_args_set_vfill_addr, sigv_mb);
+        textfield_args_set_override_defaults = linker.downcallHandle(ui_textfield_args_set_override_defaults_addr, sigv_mb);
+        textfield_args_set_colspan = linker.downcallHandle(ui_textfield_args_set_colspan_addr, sigv_mi);
+        textfield_args_set_rowspan = linker.downcallHandle(ui_textfield_args_set_rowspan_addr, sigv_mi);
+        textfield_args_set_name = linker.downcallHandle(ui_textfield_args_set_name_addr, sigv_mm);
+        textfield_args_set_style_class = linker.downcallHandle(ui_textfield_args_set_style_class_addr, sigv_mm);
+        textfield_args_set_varname = linker.downcallHandle(ui_textfield_args_set_varname_addr, sigv_mm);
+        textfield_args_set_value = linker.downcallHandle(ui_textfield_args_set_value_addr, sigv_mm);
+        textfield_args_set_onchange = linker.downcallHandle(ui_textfield_args_set_onchange_addr, sigv_mm);
+        textfield_args_set_onchangedata = linker.downcallHandle(ui_textfield_args_set_onchangedata_addr, sigv_mm);
+        textfield_args_set_onactivate = linker.downcallHandle(ui_textfield_args_set_onactivate_addr, sigv_mm);
+        textfield_args_set_onactivatedata = linker.downcallHandle(ui_textfield_args_set_onactivatedata_addr, sigv_mm);
+        textfield_args_set_groups = linker.downcallHandle(ui_textfield_args_set_groups_addr, sigv_mm);
+        textfield_args_free = linker.downcallHandle(ui_textfield_args_free_addr, sigv_m);
     }
 
     static ArgFuncs getInstance() {
index ca41a931d80515073bf59e07b1737c5954430960..32d669c24681ef33283d605ba2d30daabf1bdac1 100644 (file)
@@ -29,6 +29,7 @@ public class ButtonBuilder extends AbstractWidgetBuilder {
     public ButtonBuilder(UiObject obj, MethodHandle widgetConstructor) {
         this.obj = obj;
         this.widgetConstructor = widgetConstructor;
+        this.argsFree = ArgFuncs.getInstance().button_args_free;
     }
 
     public ButtonBuilder fill(boolean fill) {
diff --git a/ui-java/src/main/java/de/unixwork/ui/Text.java b/ui-java/src/main/java/de/unixwork/ui/Text.java
new file mode 100644 (file)
index 0000000..819a40e
--- /dev/null
@@ -0,0 +1,23 @@
+package de.unixwork.ui;
+
+public class Text {
+    public static TextAreaBuilder textarea(UiObject obj) {
+        TextFuncs ui = TextFuncs.getInstance();
+        return new TextAreaBuilder(obj, ui.textarea_create);
+    }
+
+    public static TextFieldBuilder textfield(UiObject obj) {
+        TextFuncs ui = TextFuncs.getInstance();
+        return new TextFieldBuilder(obj, ui.textfield_create);
+    }
+
+    public static TextFieldBuilder passwordfield(UiObject obj) {
+        TextFuncs ui = TextFuncs.getInstance();
+        return new TextFieldBuilder(obj, ui.passwordfield_create);
+    }
+
+    public static TextFieldBuilder framelessTextfield(UiObject obj) {
+        TextFuncs ui = TextFuncs.getInstance();
+        return new TextFieldBuilder(obj, ui.frameless_textfield_create);
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/TextAreaBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TextAreaBuilder.java
new file mode 100644 (file)
index 0000000..bc8dd43
--- /dev/null
@@ -0,0 +1,157 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.FunctionDescriptor;
+import java.lang.foreign.MemorySegment;
+import java.lang.foreign.ValueLayout;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+
+public class TextAreaBuilder extends AbstractWidgetBuilder {
+    private boolean fill;
+    private boolean hexpand;
+    private boolean vexpand;
+    private boolean hfill;
+    private boolean vfill;
+    private boolean overrideDefaults;
+    private int colspan;
+    private int rowspan;
+    private String name;
+    private String styleClass;
+    private UiText value;
+    private String varname;
+    private EventHandler onChange;
+    private int[] states;
+
+    public TextAreaBuilder(UiObject obj, MethodHandle widgetConstructor) {
+        this.obj = obj;
+        this.widgetConstructor = widgetConstructor;
+        this.argsFree = ArgFuncs.getInstance().textarea_args_free;
+    }
+
+    public TextAreaBuilder fill(boolean fill) {
+        this.fill = fill;
+        return this;
+    }
+
+    public TextAreaBuilder hexpand(boolean hexpand) {
+        this.hexpand = hexpand;
+        return this;
+    }
+
+    public TextAreaBuilder vexpand(boolean vexpand) {
+        this.vexpand = vexpand;
+        return this;
+    }
+
+    public TextAreaBuilder hfill(boolean hfill) {
+        this.hfill = hfill;
+        return this;
+    }
+
+    public TextAreaBuilder vfill(boolean vfill) {
+        this.vfill = vfill;
+        return this;
+    }
+
+    public TextAreaBuilder overrideDefaults(boolean overrideDefaults) {
+        this.overrideDefaults = overrideDefaults;
+        return this;
+    }
+
+    public TextAreaBuilder colspan(int colspan) {
+        this.colspan = colspan;
+        return this;
+    }
+
+    public TextAreaBuilder rowspan(int rowspan) {
+        this.rowspan = rowspan;
+        return this;
+    }
+
+    public TextAreaBuilder name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public TextAreaBuilder styleClass(String styleClass) {
+        this.styleClass = styleClass;
+        return this;
+    }
+
+    public TextAreaBuilder value(UiText value) {
+        this.value = value;
+        return this;
+    }
+
+    public TextAreaBuilder varname(String varname) {
+        this.varname = varname;
+        return this;
+    }
+
+    public TextAreaBuilder onChange(EventHandler onChange) {
+        this.onChange = onChange;
+        return this;
+    }
+
+    public TextAreaBuilder states(int... states) {
+        this.states = states;
+        return this;
+    }
+
+    public MemorySegment createArgs(Arena arena) throws Throwable {
+        ArgFuncs ui = ArgFuncs.getInstance();
+
+        args = (MemorySegment)ui.textarea_args_new.invoke();
+        if(fill) {
+            ui.textarea_args_set_fill.invoke(args, fill);
+        }
+        if(hexpand) {
+            ui.textarea_args_set_hexpand.invoke(args, hexpand);
+        }
+        if(vexpand) {
+            ui.textarea_args_set_vexpand.invoke(args, vexpand);
+        }
+        if(hfill) {
+            ui.textarea_args_set_hfill.invoke(args, hfill);
+        }
+        if(vfill) {
+            ui.textarea_args_set_vfill.invoke(args, vfill);
+        }
+        if(overrideDefaults) {
+            ui.textarea_args_set_override_defaults.invoke(args, overrideDefaults);
+        }
+        if(colspan > 0) {
+            ui.textarea_args_set_colspan.invoke(args, colspan);
+        }
+        if(rowspan > 0) {
+            ui.textarea_args_set_rowspan.invoke(args, rowspan);
+        }
+        if(name != null) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.textarea_args_set_name.invoke(args, cstr);
+        }
+        if(styleClass != null) {
+            MemorySegment cstr = arena.allocateFrom(styleClass);
+            ui.textarea_args_set_style_class.invoke(args, cstr);
+        }
+
+        if(onChange != null) {
+            EventWrapper event = new EventWrapper(obj, onChange);
+
+            // set toolkit args
+            ui.textarea_args_set_onchange.invoke(args, event.getCallback());
+            ui.textarea_args_set_onchangedata.invoke(args, event.getUserData());
+        }
+        if(varname != null) {
+            MemorySegment cstr = arena.allocateFrom(varname);
+            ui.textarea_args_set_varname.invoke(args, cstr);
+        }
+        if(value != null) {
+            ui.textarea_args_set_value.invoke(args, value.valuePtr);
+        }
+
+        return args;
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/TextFieldBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TextFieldBuilder.java
new file mode 100644 (file)
index 0000000..7e46ef9
--- /dev/null
@@ -0,0 +1,171 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.FunctionDescriptor;
+import java.lang.foreign.MemorySegment;
+import java.lang.foreign.ValueLayout;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+
+public class TextFieldBuilder extends AbstractWidgetBuilder {
+    private boolean fill;
+    private boolean hexpand;
+    private boolean vexpand;
+    private boolean hfill;
+    private boolean vfill;
+    private boolean overrideDefaults;
+    private int colspan;
+    private int rowspan;
+    private String name;
+    private String styleClass;
+    private UiString value;
+    private String varname;
+    private EventHandler onChange;
+    private EventHandler onActivate;
+    private int[] states;
+
+    public TextFieldBuilder(UiObject obj, MethodHandle widgetConstructor) {
+        this.obj = obj;
+        this.widgetConstructor = widgetConstructor;
+        this.argsFree = ArgFuncs.getInstance().textfield_args_free;
+    }
+
+    public TextFieldBuilder fill(boolean fill) {
+        this.fill = fill;
+        return this;
+    }
+
+    public TextFieldBuilder hexpand(boolean hexpand) {
+        this.hexpand = hexpand;
+        return this;
+    }
+
+    public TextFieldBuilder vexpand(boolean vexpand) {
+        this.vexpand = vexpand;
+        return this;
+    }
+
+    public TextFieldBuilder hfill(boolean hfill) {
+        this.hfill = hfill;
+        return this;
+    }
+
+    public TextFieldBuilder vfill(boolean vfill) {
+        this.vfill = vfill;
+        return this;
+    }
+
+    public TextFieldBuilder overrideDefaults(boolean overrideDefaults) {
+        this.overrideDefaults = overrideDefaults;
+        return this;
+    }
+
+    public TextFieldBuilder colspan(int colspan) {
+        this.colspan = colspan;
+        return this;
+    }
+
+    public TextFieldBuilder rowspan(int rowspan) {
+        this.rowspan = rowspan;
+        return this;
+    }
+
+    public TextFieldBuilder name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public TextFieldBuilder styleClass(String styleClass) {
+        this.styleClass = styleClass;
+        return this;
+    }
+    
+    public TextFieldBuilder value(UiString value) {
+        this.value = value;
+        return this;
+    }
+    
+    public TextFieldBuilder varname(String varname) {
+        this.varname = varname;
+        return this;
+    }
+    
+    public TextFieldBuilder onChange(EventHandler onChange) {
+        this.onChange = onChange;
+        return this;
+    }
+    
+    public TextFieldBuilder onActivate(EventHandler onActivate) {
+        this.onActivate = onActivate;
+        return this;
+    }
+    
+    public TextFieldBuilder states(int... states) {
+        this.states = states;
+        return this;
+    }
+
+    public MemorySegment createArgs(Arena arena) throws Throwable {
+        ArgFuncs ui = ArgFuncs.getInstance();
+
+        args = (MemorySegment)ui.textfield_args_new.invoke();
+        if(fill) {
+            ui.textfield_args_set_fill.invoke(args, fill);
+        }
+        if(hexpand) {
+            ui.textfield_args_set_hexpand.invoke(args, hexpand);
+        }
+        if(vexpand) {
+            ui.textfield_args_set_vexpand.invoke(args, vexpand);
+        }
+        if(hfill) {
+            ui.textfield_args_set_hfill.invoke(args, hfill);
+        }
+        if(vfill) {
+            ui.textfield_args_set_vfill.invoke(args, vfill);
+        }
+        if(overrideDefaults) {
+            ui.textfield_args_set_override_defaults.invoke(args, overrideDefaults);
+        }
+        if(colspan > 0) {
+            ui.textfield_args_set_colspan.invoke(args, colspan);
+        }
+        if(rowspan > 0) {
+            ui.textfield_args_set_rowspan.invoke(args, rowspan);
+        }
+        if(name != null) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.textfield_args_set_name.invoke(args, cstr);
+        }
+        if(styleClass != null) {
+            MemorySegment cstr = arena.allocateFrom(styleClass);
+            ui.textfield_args_set_style_class.invoke(args, cstr);
+        }
+
+        if(onChange != null) {
+            EventWrapper event = new EventWrapper(obj, onChange);
+
+            // set toolkit args
+            ui.textfield_args_set_onchange.invoke(args, event.getCallback());
+            ui.textfield_args_set_onchangedata.invoke(args, event.getUserData());
+        }
+        if(varname != null) {
+            MemorySegment cstr = arena.allocateFrom(varname);
+            ui.textfield_args_set_varname.invoke(args, cstr);
+        }
+        if(value != null) {
+            ui.textfield_args_set_value.invoke(args, value.valuePtr);
+        }
+
+        if(onActivate != null) {
+            EventWrapper event = new EventWrapper(obj, onActivate);
+
+            // set toolkit args
+            ui.textfield_args_set_onactivate.invoke(args, event.getCallback());
+            ui.textfield_args_set_onactivatedata.invoke(args, event.getUserData());
+        }
+
+        return args;
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/TextFuncs.java b/ui-java/src/main/java/de/unixwork/ui/TextFuncs.java
new file mode 100644 (file)
index 0000000..dc50ae9
--- /dev/null
@@ -0,0 +1,39 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.*;
+import java.lang.invoke.MethodHandle;
+
+public class TextFuncs {
+    static TextFuncs instance;
+
+    public MethodHandle textarea_create;
+    public MethodHandle textfield_create;
+    public MethodHandle frameless_textfield_create;
+    public MethodHandle passwordfield_create;
+    public MethodHandle path_textfield_create;
+
+    private TextFuncs(Linker linker, SymbolLookup lib) {
+        // void* func(void*, void*)
+        FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+
+        MemorySegment ui_textarea_create_addr = lib.find("ui_textarea_create").orElseThrow();
+        MemorySegment ui_textfield_create_addr = lib.find("ui_textfield_create").orElseThrow();
+        MemorySegment ui_frameless_textfield_create_addr = lib.find("ui_frameless_textfield_create").orElseThrow();
+        MemorySegment ui_passwordfield_create_addr = lib.find("ui_passwordfield_create").orElseThrow();
+        MemorySegment ui_path_textfield_create_addr = lib.find("ui_path_textfield_create").orElseThrow();
+
+        textarea_create = linker.downcallHandle(ui_textarea_create_addr, sigm_mm);
+        textfield_create = linker.downcallHandle(ui_textfield_create_addr, sigm_mm);
+        frameless_textfield_create = linker.downcallHandle(ui_frameless_textfield_create_addr, sigm_mm);
+        passwordfield_create = linker.downcallHandle(ui_passwordfield_create_addr, sigm_mm);
+        path_textfield_create = linker.downcallHandle(ui_path_textfield_create_addr, sigm_mm);
+    }
+
+    static TextFuncs getInstance() {
+        if (instance == null) {
+            Toolkit toolkit = Toolkit.getInstance();
+            instance = new TextFuncs(toolkit.getLinker(), toolkit.getSymbolLookup());
+        }
+        return instance;
+    }
+}