]> uap-core.de Git - rssreader.git/commitdiff
add tabview
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 28 Aug 2025 18:38:53 +0000 (20:38 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 28 Aug 2025 18:38:53 +0000 (20:38 +0200)
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/Container.java
ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/TabViewType.java [new file with mode: 0644]
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt

index 3bf857a20b602deaa37303f2a423767516e517db..03818b4de914aacda2897941489b4e865fd17287 100644 (file)
@@ -150,6 +150,29 @@ class ArgFuncs {
     MethodHandle splitpane_args_set_max_panes;
     MethodHandle splitpane_args_free;
 
+    MethodHandle tabview_args_new;
+    MethodHandle tabview_args_set_fill;
+    MethodHandle tabview_args_set_hexpand;
+    MethodHandle tabview_args_set_vexpand;
+    MethodHandle tabview_args_set_hfill;
+    MethodHandle tabview_args_set_vfill;
+    MethodHandle tabview_args_set_override_defaults;
+    MethodHandle tabview_args_set_colspan;
+    MethodHandle tabview_args_set_rowspan;
+    MethodHandle tabview_args_set_name;
+    MethodHandle tabview_args_set_style_class;
+    MethodHandle tabview_args_set_margin;
+    MethodHandle tabview_args_set_spacing;
+    MethodHandle tabview_args_set_columnspacing;
+    MethodHandle tabview_args_set_rowspacing;
+    MethodHandle tabview_args_set_type;
+    MethodHandle tabview_args_set_onchange;
+    MethodHandle tabview_args_set_onchangedata;
+    MethodHandle tabview_args_set_varname;
+    MethodHandle tabview_args_set_value;
+    MethodHandle tabview_args_set_subcontainer;
+    MethodHandle tabview_args_free;
+
     MethodHandle sidebar_args_new;
     MethodHandle sidebar_args_set_name;
     MethodHandle sidebar_args_set_style_class;
@@ -534,6 +557,29 @@ class ArgFuncs {
         MemorySegment ui_splitpane_args_set_max_panes_addr = lib.find("ui_splitpane_args_set_max_panes").orElseThrow();
         MemorySegment ui_splitpane_args_free_addr = lib.find("ui_splitpane_args_free").orElseThrow();
 
+        MemorySegment ui_tabview_args_new_addr = lib.find("ui_tabview_args_new").orElseThrow();
+        MemorySegment ui_tabview_args_set_fill_addr = lib.find("ui_tabview_args_set_fill").orElseThrow();
+        MemorySegment ui_tabview_args_set_hexpand_addr = lib.find("ui_tabview_args_set_hexpand").orElseThrow();
+        MemorySegment ui_tabview_args_set_vexpand_addr = lib.find("ui_tabview_args_set_vexpand").orElseThrow();
+        MemorySegment ui_tabview_args_set_hfill_addr = lib.find("ui_tabview_args_set_hfill").orElseThrow();
+        MemorySegment ui_tabview_args_set_vfill_addr = lib.find("ui_tabview_args_set_vfill").orElseThrow();
+        MemorySegment ui_tabview_args_set_override_defaults_addr = lib.find("ui_tabview_args_set_override_defaults").orElseThrow();
+        MemorySegment ui_tabview_args_set_colspan_addr = lib.find("ui_tabview_args_set_colspan").orElseThrow();
+        MemorySegment ui_tabview_args_set_rowspan_addr = lib.find("ui_tabview_args_set_rowspan").orElseThrow();
+        MemorySegment ui_tabview_args_set_name_addr = lib.find("ui_tabview_args_set_name").orElseThrow();
+        MemorySegment ui_tabview_args_set_style_class_addr = lib.find("ui_tabview_args_set_style_class").orElseThrow();
+        MemorySegment ui_tabview_args_set_margin_addr = lib.find("ui_tabview_args_set_margin").orElseThrow();
+        MemorySegment ui_tabview_args_set_spacing_addr = lib.find("ui_tabview_args_set_spacing").orElseThrow();
+        MemorySegment ui_tabview_args_set_columnspacing_addr = lib.find("ui_tabview_args_set_columnspacing").orElseThrow();
+        MemorySegment ui_tabview_args_set_rowspacing_addr = lib.find("ui_tabview_args_set_rowspacing").orElseThrow();
+        MemorySegment ui_tabview_args_set_type_addr = lib.find("ui_tabview_args_set_type").orElseThrow();
+        MemorySegment ui_tabview_args_set_onchange_addr = lib.find("ui_tabview_args_set_onchange").orElseThrow();
+        MemorySegment ui_tabview_args_set_onchangedata_addr = lib.find("ui_tabview_args_set_onchangedata").orElseThrow();
+        MemorySegment ui_tabview_args_set_varname_addr = lib.find("ui_tabview_args_set_varname").orElseThrow();
+        MemorySegment ui_tabview_args_set_value_addr = lib.find("ui_tabview_args_set_value").orElseThrow();
+        MemorySegment ui_tabview_args_set_subcontainer_addr = lib.find("ui_tabview_args_set_subcontainer").orElseThrow();
+        MemorySegment ui_tabview_args_free_addr = lib.find("ui_tabview_args_free").orElseThrow();
+
         MemorySegment ui_sidebar_args_new_addr = lib.find("ui_sidebar_args_new").orElseThrow();
         MemorySegment ui_sidebar_args_set_name_addr = lib.find("ui_sidebar_args_set_name").orElseThrow();
         MemorySegment ui_sidebar_args_set_style_class_addr = lib.find("ui_sidebar_args_set_style_class").orElseThrow();
@@ -909,6 +955,29 @@ class ArgFuncs {
         splitpane_args_set_max_panes = linker.downcallHandle(ui_splitpane_args_set_max_panes_addr, sigv_mi);
         splitpane_args_free = linker.downcallHandle(ui_splitpane_args_free_addr, sigv_m);
 
+        tabview_args_new =  linker.downcallHandle(ui_tabview_args_new_addr, sigm);
+        tabview_args_set_fill = linker.downcallHandle(ui_tabview_args_set_fill_addr, sigv_mb);
+        tabview_args_set_hexpand = linker.downcallHandle(ui_tabview_args_set_hexpand_addr, sigv_mb);
+        tabview_args_set_vexpand = linker.downcallHandle(ui_tabview_args_set_vexpand_addr, sigv_mb);
+        tabview_args_set_hfill = linker.downcallHandle(ui_tabview_args_set_hfill_addr, sigv_mb);
+        tabview_args_set_vfill = linker.downcallHandle(ui_tabview_args_set_vfill_addr, sigv_mb);
+        tabview_args_set_override_defaults = linker.downcallHandle(ui_tabview_args_set_override_defaults_addr, sigv_mb);
+        tabview_args_set_colspan = linker.downcallHandle(ui_tabview_args_set_colspan_addr, sigv_mi);
+        tabview_args_set_rowspan = linker.downcallHandle(ui_tabview_args_set_rowspan_addr, sigv_mi);
+        tabview_args_set_name = linker.downcallHandle(ui_tabview_args_set_name_addr, sigv_mm);
+        tabview_args_set_style_class = linker.downcallHandle(ui_tabview_args_set_style_class_addr, sigv_mm);
+        tabview_args_set_margin = linker.downcallHandle(ui_tabview_args_set_margin_addr, sigv_mi);
+        tabview_args_set_spacing = linker.downcallHandle(ui_tabview_args_set_spacing_addr, sigv_mi);
+        tabview_args_set_columnspacing = linker.downcallHandle(ui_tabview_args_set_columnspacing_addr, sigv_mi);
+        tabview_args_set_rowspacing = linker.downcallHandle(ui_tabview_args_set_rowspacing_addr, sigv_mi);
+        tabview_args_set_type = linker.downcallHandle(ui_tabview_args_set_type_addr, sigv_mi);
+        tabview_args_set_onchange = linker.downcallHandle(ui_tabview_args_set_onchange_addr, sigv_mm);
+        tabview_args_set_onchangedata = linker.downcallHandle(ui_tabview_args_set_onchangedata_addr, sigv_mm);
+        tabview_args_set_varname = linker.downcallHandle(ui_tabview_args_set_varname_addr, sigv_mm);
+        tabview_args_set_value = linker.downcallHandle(ui_tabview_args_set_value_addr, sigv_mm);
+        tabview_args_set_subcontainer = linker.downcallHandle(ui_tabview_args_set_subcontainer_addr, sigv_mi);
+        tabview_args_free = linker.downcallHandle(ui_tabview_args_free_addr, sigv_m);
+
         sidebar_args_new = linker.downcallHandle(ui_sidebar_args_new_addr, sigm);
         sidebar_args_set_name = linker.downcallHandle(ui_sidebar_args_set_name_addr, sigv_mm);
         sidebar_args_set_style_class = linker.downcallHandle(ui_sidebar_args_set_style_class_addr, sigv_mm);
index fbf76ef5bc69cbdf65107e320bd4e320bdd5c3b8..54684458a68913853bc3e2bc9cde9c59c2e3af64 100644 (file)
@@ -43,6 +43,11 @@ public class Container implements AutoCloseable {
         return new ContainerBuilder(obj, ui.grid_create);
     }
 
+    public static TabViewBuilder tabview(UiObject obj) {
+        ContainerFuncs ui = ContainerFuncs.getInstance();
+        return new TabViewBuilder(obj, ui.tabview_create);
+    }
+
     public static void newline(UiObject obj) {
         ContainerFuncs ui = ContainerFuncs.getInstance();
         try {
diff --git a/ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java
new file mode 100644 (file)
index 0000000..5f1ea13
--- /dev/null
@@ -0,0 +1,203 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+import java.lang.invoke.MethodHandle;
+
+public class TabViewBuilder 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 int margin;
+    private int spacing;
+    private int columnspacing;
+    private int rowspacing;
+    private TabViewType type = TabViewType.DEFAULT;
+    private EventHandler onChange;
+    private String varname;
+    private UiInteger value;
+    // TODO: subcontainer type
+
+    public TabViewBuilder(UiObject obj, MethodHandle widgetConstructor) {
+        this.obj = obj;
+        this.widgetConstructor = widgetConstructor;
+    }
+
+    public TabViewBuilder fill(boolean fill) {
+        this.fill = fill;
+        return this;
+    }
+
+    public TabViewBuilder hexpand(boolean hexpand) {
+        this.hexpand = hexpand;
+        return this;
+    }
+
+    public TabViewBuilder vexpand(boolean vexpand) {
+        this.vexpand = vexpand;
+        return this;
+    }
+
+    public TabViewBuilder hfill(boolean hfill) {
+        this.hfill = hfill;
+        return this;
+    }
+
+    public TabViewBuilder vfill(boolean vfill) {
+        this.vfill = vfill;
+        return this;
+    }
+
+    public TabViewBuilder overrideDefaults(boolean overrideDefaults) {
+        this.overrideDefaults = overrideDefaults;
+        return this;
+    }
+
+    public TabViewBuilder colspan(int colspan) {
+        this.colspan = colspan;
+        return this;
+    }
+
+    public TabViewBuilder rowspan(int rowspan) {
+        this.rowspan = rowspan;
+        return this;
+    }
+
+    public TabViewBuilder name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public TabViewBuilder styleClass(String styleClass) {
+        this.styleClass = styleClass;
+        return this;
+    }
+
+    public TabViewBuilder margin(int margin) {
+        this.margin = margin;
+        return this;
+    }
+
+    public TabViewBuilder spacing(int sacing) {
+        this.spacing = sacing;
+        return this;
+    }
+
+    public TabViewBuilder columnspacing(int columnspacing) {
+        this.columnspacing = columnspacing;
+        return this;
+    }
+
+    public TabViewBuilder rowspacing(int rowspacing) {
+        this.rowspacing = rowspacing;
+        return this;
+    }
+
+    public TabViewBuilder type(TabViewType type) {
+        this.type = type;
+        return this;
+    }
+
+    public TabViewBuilder onChange(EventHandler onChange) {
+        this.onChange = onChange;
+        return this;
+    }
+
+    public TabViewBuilder varname(String varname) {
+        this.varname = varname;
+        return this;
+    }
+
+    public TabViewBuilder value(UiInteger value) {
+        this.value = value;
+        return this;
+    }
+
+    @Override
+    public MemorySegment createArgs(Arena arena) throws Throwable {
+        ArgFuncs ui = ArgFuncs.getInstance();
+
+        args = (MemorySegment)ui.tabview_args_new.invoke();
+        if(fill) {
+            ui.tabview_args_set_fill.invoke(args, fill);
+        }
+        if(hexpand) {
+            ui.tabview_args_set_hexpand.invoke(args, hexpand);
+        }
+        if(vexpand) {
+            ui.tabview_args_set_vexpand.invoke(args, vexpand);
+        }
+        if(hfill) {
+            ui.tabview_args_set_hfill.invoke(args, hfill);
+        }
+        if(vfill) {
+            ui.tabview_args_set_vfill.invoke(args, vfill);
+        }
+        if(overrideDefaults) {
+            ui.tabview_args_set_override_defaults.invoke(args, overrideDefaults);
+        }
+        if(colspan > 0) {
+            ui.tabview_args_set_colspan.invoke(args, colspan);
+        }
+        if(rowspan > 0) {
+            ui.tabview_args_set_rowspan.invoke(args, rowspan);
+        }
+        if(name != null) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.tabview_args_set_name.invoke(args, cstr);
+        }
+        if(styleClass != null) {
+            MemorySegment cstr = arena.allocateFrom(styleClass);
+            ui.tabview_args_set_style_class.invoke(args, cstr);
+        }
+        if(margin > 0) {
+            ui.tabview_args_set_margin.invoke(args, margin);
+        }
+        if(spacing > 0) {
+            ui.tabview_args_set_spacing.invoke(args, spacing);
+        }
+        if(columnspacing > 0) {
+            ui.tabview_args_set_columnspacing.invoke(args, columnspacing);
+        }
+        if(rowspacing > 0) {
+            ui.tabview_args_set_rowspacing.invoke(args, rowspacing);
+        }
+        ui.tabview_args_set_type.invoke(args, type.getValue());
+        if(onChange != null) {
+            EventWrapper event = new EventWrapper(obj, onChange);
+
+            // set toolkit args
+            ui.tabview_args_set_onchange.invoke(args, event.getCallback());
+            ui.tabview_args_set_onchangedata.invoke(args, event.getUserData());
+        }
+        if(varname != null) {
+            MemorySegment cstr = arena.allocateFrom(varname);
+            ui.tabview_args_set_varname.invoke(args, cstr);
+        }
+        if(value != null) {
+            ui.tabview_args_set_value.invoke(args, value.valuePtr);
+        }
+        // TODO: subcontainer type
+
+        return args;
+    }
+
+    public Container createContainer() {
+        UiWidget w = create();
+        return new Container(obj, w);
+    }
+
+    public UiWidget create(ContainerUI ui) {
+        Container container = createContainer();
+        ui.callback();
+        container.close();
+        return container.getWidget();
+    }
+}
diff --git a/ui-java/src/main/java/de/unixwork/ui/TabViewType.java b/ui-java/src/main/java/de/unixwork/ui/TabViewType.java
new file mode 100644 (file)
index 0000000..ca76599
--- /dev/null
@@ -0,0 +1,20 @@
+package de.unixwork.ui;
+
+public enum TabViewType {
+    DEFAULT(0),
+    DOC(1),
+    NAVIGATION_SIDE(2),
+    NAVIGATION_TOP(3),
+    NAVIGATION_TOP2(4),
+    INVISIBLE(5);
+
+    TabViewType(int value) {
+        this.value = value;
+    }
+
+    private final int value;
+
+    public int getValue() {
+        return value;
+    }
+}
index 5822d8b7cdafdf2075a5641d0b46f16d3fc8f177..ad155da8598c1e99bef8df476b67ee7fcde68da7 100644 (file)
@@ -25,6 +25,7 @@ import de.unixwork.ui.WebView
 import de.unixwork.ui.Label
 import de.unixwork.ui.LinkButtonType
 import de.unixwork.ui.ListViewBuilder
+import de.unixwork.ui.TabViewType
 import de.unixwork.ui.TableModel
 import de.unixwork.ui.TableViewBuilder
 import de.unixwork.ui.UiText
@@ -386,6 +387,83 @@ class Toplevel(obj: UiObject) {
         )
     }
 
+    fun tabview(
+        fill: Boolean = false,
+        hexpand: Boolean = false,
+        vexpand: Boolean = false,
+        hfill: Boolean = false,
+        vfill: Boolean = false,
+        overrideDefaults: Boolean = false,
+        colspan: Int = -1,
+        rowspan: Int = -1,
+        name: String? = null,
+        styleClass: String? = null,
+        margin: Int = -1,
+        spacing: Int = -1,
+        columnspacing: Int = -1,
+        rowspacing: Int = -1,
+        type: TabViewType = TabViewType.DEFAULT,
+        varname: String? = null,
+        value: UiInteger? = null,
+        onChange: EventHandler? = null,
+        ui: ContainerUI? = null
+    ): UiWidget {
+        val container = Container.tabview(this@Toplevel.ui)
+        if(fill) {
+            container.fill(true)
+        }
+        if(hexpand) {
+            container.hexpand(true)
+        }
+        if(vexpand) {
+            container.vexpand(true)
+        }
+        if(hfill) {
+            container.hfill(true)
+        }
+        if(vfill) {
+            container.vfill(true)
+        }
+        if(overrideDefaults) {
+            container.overrideDefaults(true)
+        }
+        if(name != null) {
+            container.name(name)
+        }
+        if(styleClass != null) {
+            container.styleClass(styleClass)
+        }
+        if(colspan > 0) {
+            container.colspan(colspan)
+        }
+        if(rowspan > 0) {
+            container.rowspan(rowspan)
+        }
+        if(margin > 0) {
+            container.margin(margin)
+        }
+        if(spacing > 0) {
+            container.spacing(spacing)
+        }
+        if(columnspacing > 0) {
+            container.columnspacing(columnspacing)
+        }
+        if(rowspacing > 0) {
+            container.rowspacing(rowspacing)
+        }
+        container.type(type)
+        if(varname != null) {
+            container.varname(varname)
+        }
+        if(value != null) {
+            container.value(value)
+        }
+        if(onChange != null) {
+            container.onChange(onChange)
+        }
+        return container.create(ui)
+    }
+
     private fun createSplitpane(
         horizontal: Boolean,
         fill: Boolean = false,