From: Olaf Wintermann Date: Thu, 26 Jun 2025 20:27:48 +0000 (+0200) Subject: add UiList first/next/get implementation X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=e2ae5398e578ff8e1936c3bbaff5eede43f2f12b;p=rssreader.git add UiList first/next/get implementation --- diff --git a/ui-java/src/main/java/de/unixwork/ui/CUtils.java b/ui-java/src/main/java/de/unixwork/ui/CUtils.java index 0be062c..49e364d 100644 --- a/ui-java/src/main/java/de/unixwork/ui/CUtils.java +++ b/ui-java/src/main/java/de/unixwork/ui/CUtils.java @@ -18,8 +18,7 @@ public class CUtils { try { long size = utf8.length + 1; MemorySegment cstr = (MemorySegment) tk.malloc.invoke(size); - MemorySegment segment = MemorySegment.ofAddress(cstr.address()); - ByteBuffer buf = segment.asByteBuffer(); + ByteBuffer buf = cstr.asByteBuffer(); buf.put(utf8); buf.put((byte) 0); return cstr; diff --git a/ui-java/src/main/java/de/unixwork/ui/Context.java b/ui-java/src/main/java/de/unixwork/ui/Context.java index 36c3da4..ffd680e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Context.java +++ b/ui-java/src/main/java/de/unixwork/ui/Context.java @@ -63,6 +63,14 @@ public abstract class Context { return funcData; } + public UiList getList(int index) { + return lists.get(index); + } + + public ListValueConverter getValueConverter(int index) { + return converters.get(index); + } + public void attach(Document doc) { ToolkitFuncs ui = ToolkitFuncs.getInstance(); diff --git a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java index a094ee7..b0105fc 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java @@ -6,6 +6,18 @@ import java.lang.invoke.MethodHandle; public class ListFuncs { static ListFuncs instance; + public MethodHandle list_class_set_first; + public MethodHandle list_class_set_next; + public MethodHandle list_class_set_get; + public MethodHandle list_class_set_count; + public MethodHandle list_class_set_data; + public MethodHandle list_class_set_iter; + + public MethodHandle list_get_data; + public MethodHandle list_set_data; + public MethodHandle list_get_iter; + public MethodHandle list_set_iter; + public MethodHandle listview_create; public MethodHandle table_create; public MethodHandle combobox_create; @@ -14,12 +26,38 @@ public class ListFuncs { private ListFuncs(Linker linker, SymbolLookup lib) { // void* func(void*, void*) FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS); + + MemorySegment ui_list_class_set_first_addr = lib.find("ui_list_class_set_first").orElseThrow(); + MemorySegment ui_list_class_set_next_addr = lib.find("ui_list_class_set_next").orElseThrow(); + MemorySegment ui_list_class_set_get_addr = lib.find("ui_list_class_set_get").orElseThrow(); + MemorySegment ui_list_class_set_count_addr = lib.find("ui_list_class_set_count").orElseThrow(); + MemorySegment ui_list_class_set_data_addr = lib.find("ui_list_class_set_data").orElseThrow(); + MemorySegment ui_list_class_set_iter_addr = lib.find("ui_list_class_set_iter").orElseThrow(); + + MemorySegment ui_list_get_data_addr = lib.find("ui_list_get_data").orElseThrow(); + MemorySegment ui_list_set_data_addr = lib.find("ui_list_set_data").orElseThrow(); + MemorySegment ui_list_get_iter_addr = lib.find("ui_list_get_iter").orElseThrow(); + MemorySegment ui_list_set_iter_addr = lib.find("ui_list_set_iter").orElseThrow(); MemorySegment ui_listview_create_addr = lib.find("ui_listview_create").orElseThrow(); MemorySegment ui_table_create_addr = lib.find("ui_table_create").orElseThrow(); MemorySegment ui_combobox_create_addr = lib.find("ui_combobox_create").orElseThrow(); MemorySegment ui_sourcelist_create_addr = lib.find("ui_sourcelist_create").orElseThrow(); + list_class_set_first = linker.downcallHandle(ui_list_class_set_first_addr, sigv_mm); + list_class_set_next = linker.downcallHandle(ui_list_class_set_next_addr, sigv_mm); + list_class_set_get = linker.downcallHandle(ui_list_class_set_get_addr, sigv_mm); + list_class_set_count = linker.downcallHandle(ui_list_class_set_count_addr, sigv_mm); + list_class_set_data = linker.downcallHandle(ui_list_class_set_data_addr, sigv_mm); + list_class_set_iter = linker.downcallHandle(ui_list_class_set_iter_addr, sigv_mm); + + list_get_data = linker.downcallHandle(ui_list_get_data_addr, sigm_m); + list_set_data = linker.downcallHandle(ui_list_set_data_addr, sigm_mm); + list_get_iter = linker.downcallHandle(ui_list_get_iter_addr, sigm_m); + list_set_iter = linker.downcallHandle(ui_list_set_iter_addr, sigm_mm); + listview_create = linker.downcallHandle(ui_listview_create_addr, sigm_mm); table_create = linker.downcallHandle(ui_table_create_addr, sigm_mm); combobox_create = linker.downcallHandle(ui_combobox_create_addr, sigm_mm); diff --git a/ui-java/src/main/java/de/unixwork/ui/ListView.java b/ui-java/src/main/java/de/unixwork/ui/ListView.java index 3806309..151c201 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListView.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListView.java @@ -3,8 +3,8 @@ package de.unixwork.ui; public class ListView { - public static ListViewBuilder list(UiObject obj) { + public static ListViewBuilder list(UiObject obj) { ListFuncs ui = ListFuncs.getInstance(); - return new ListViewBuilder(obj, ui.listview_create); + return new ListViewBuilder(obj, ui.listview_create); } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java index 0af74c8..7f85637 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListViewBuilder.java @@ -34,82 +34,88 @@ public class ListViewBuilder extends AbstractWidgetBuilder { this.widgetConstructor = widgetConstructor; } - public ListViewBuilder fill(boolean fill) { + public ListViewBuilder fill(boolean fill) { this.fill = fill; return this; } - public ListViewBuilder hexpand(boolean hexpand) { + public ListViewBuilder hexpand(boolean hexpand) { this.hexpand = hexpand; return this; } - public ListViewBuilder vexpand(boolean vexpand) { + public ListViewBuilder vexpand(boolean vexpand) { this.vexpand = vexpand; return this; } - public ListViewBuilder hfill(boolean hfill) { + public ListViewBuilder hfill(boolean hfill) { this.hfill = hfill; return this; } - public ListViewBuilder vfill(boolean vfill) { + public ListViewBuilder vfill(boolean vfill) { this.vfill = vfill; return this; } - public ListViewBuilder overrideDefaults(boolean overrideDefaults) { + public ListViewBuilder overrideDefaults(boolean overrideDefaults) { this.overrideDefaults = overrideDefaults; return this; } - public ListViewBuilder colspan(int colspan) { + public ListViewBuilder colspan(int colspan) { this.colspan = colspan; return this; } - public ListViewBuilder rowspan(int rowspan) { + public ListViewBuilder rowspan(int rowspan) { this.rowspan = rowspan; return this; } - public ListViewBuilder name(String name) { + public ListViewBuilder name(String name) { this.name = name; return this; } - public ListViewBuilder styleClass(String styleClass) { + + public ListViewBuilder styleClass(String styleClass) { this.styleClass = styleClass; return this; } - public ListViewBuilder varname(String varname) { + public ListViewBuilder varname(String varname) { this.varname = varname; return this; } - public ListViewBuilder onActivate(EventHandler onActivate) { + public ListViewBuilder getvalue(ListValueConverter getvalue) { + this.getvalue = getvalue; + return this; + } + + public ListViewBuilder onActivate(EventHandler onActivate) { this.onActivate = onActivate; return this; } - public ListViewBuilder onDragStart(EventHandler onDragStart) { + public ListViewBuilder onDragStart(EventHandler onDragStart) { this.onDragStart = onDragStart; return this; } - public ListViewBuilder onDragComplete(EventHandler onDragComplete) { + public ListViewBuilder onDragComplete(EventHandler onDragComplete) { this.onDragComplete = onDragComplete; return this; } - public ListViewBuilder onDrop(EventHandler onDrop) { + public ListViewBuilder onDrop(EventHandler onDrop) { this.onDrop = onDrop; return this; } - public ListViewBuilder states(int... states) { + public ListViewBuilder states(int... states) { this.states = states; return this; } diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java index 7a7e44d..6c1e13b 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -111,11 +111,23 @@ public class Toolkit { MethodHandle getvalue = MethodHandles.lookup().findStatic( Toolkit.class, "getValue", - MethodType.methodType(MemorySegment.class, MemorySegment.class, MemorySegment.class, int.class, int.class, MemorySegment.class)); + MethodType.methodType(MemorySegment.class, + MemorySegment.class, + MemorySegment.class, + int.class, + int.class, + MemorySegment.class, + MemorySegment.class)); getValue = linker.upcallStub( getvalue, - FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_INT, ValueLayout.JAVA_INT, ValueLayout.ADDRESS), + FunctionDescriptor.of(ValueLayout.ADDRESS, + ValueLayout.ADDRESS, + ValueLayout.ADDRESS, + ValueLayout.JAVA_INT, + ValueLayout.JAVA_INT, + ValueLayout.ADDRESS, + ValueLayout.ADDRESS), staticArena); } catch (NoSuchMethodException e) { throw new RuntimeException(e); @@ -312,8 +324,22 @@ public class Toolkit { /* * list getvaluefunc wrapper */ - public static MemorySegment getValue(MemorySegment list, MemorySegment elm, int row, int col, MemorySegment userdata) { - + public static MemorySegment getValue(MemorySegment list, MemorySegment elm, int row, int col, MemorySegment userdata, MemorySegment freeValue) { + long ctxPtr = userdata.getAtIndex(ValueLayout.JAVA_LONG, 0); + long converterIndex = userdata.getAtIndex(ValueLayout.JAVA_LONG, 1); + + long listCtxPtr = list.getAtIndex(ValueLayout.JAVA_LONG, 0); + long listIndex = list.getAtIndex(ValueLayout.JAVA_LONG, 1); + Context listCtx = Toolkit.getInstance().getContext(listCtxPtr); + UiList uilist = listCtx.getList((int)listIndex); + + Context ctx = Toolkit.getInstance().getContext(ctxPtr); + ListValueConverter conv = ctx.getValueConverter((int)converterIndex); + Object value = conv.getValue(null, col); + if(value instanceof String) { + freeValue.setAtIndex(ValueLayout.JAVA_BOOLEAN, 0, true); + return CUtils.cstring((String)value); + } return MemorySegment.NULL; } diff --git a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java index 9dd4ea9..f858b75 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -114,7 +114,7 @@ public class ToolkitFuncs { range_new = linker.downcallHandle(range_new_addr, sigm_mm); generic_new = linker.downcallHandle(generic_new_addr, sigm_mm); list_new = linker.downcallHandle(list_new_addr, sigm_mm); - list_new2 = linker.downcallHandle(list_new_addr, FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS)); + list_new2 = linker.downcallHandle(list_new2_addr, FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS)); string_set = linker.downcallHandle(string_set_addr, sigv_mm); string_get = linker.downcallHandle(string_get_addr, sigm_m); diff --git a/ui-java/src/main/java/de/unixwork/ui/UiList.java b/ui-java/src/main/java/de/unixwork/ui/UiList.java index fc1296f..f11f18d 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiList.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiList.java @@ -12,6 +12,7 @@ import java.util.ArrayList; public class UiList extends ArrayList { protected MemorySegment valuePtr; protected MemorySegment dataPtr; + protected int iter = 0; protected UiList(Context ctx, String name, MemorySegment listObj) { super(); @@ -45,23 +46,63 @@ public class UiList extends ArrayList { } private static void initList(MemorySegment ctx, MemorySegment list, MemorySegment userData) { - // TODO + ListFuncs ui = ListFuncs.getInstance(); + Toolkit toolkit = Toolkit.getInstance(); + + try { + ui.list_class_set_first.invoke(list, toolkit.listFirst); + ui.list_class_set_next.invoke(list, toolkit.listNext); + ui.list_class_set_get.invoke(list, toolkit.listGet); + ui.list_class_set_count.invoke(list, toolkit.listCount); + ui.list_set_data.invoke(list, userData); + } catch (Throwable e) { + throw new RuntimeException(e); + } } - protected static MemorySegment first(MemorySegment list) { - return MemorySegment.NULL; + public static UiList getList(MemorySegment ls) { + ListFuncs ui = ListFuncs.getInstance(); + try { + MemorySegment data = ((MemorySegment)ui.list_get_data.invoke(ls)); + data = data.reinterpret(16); + long ctxPtr = data.getAtIndex(ValueLayout.JAVA_LONG, 0); + long listIndex = data.getAtIndex(ValueLayout.JAVA_LONG, 1); + Context ctx = Toolkit.getInstance().getContext(ctxPtr); + return ctx.getList((int)listIndex); + } catch (Throwable e) { + throw new RuntimeException(e); + } } - protected static MemorySegment next(MemorySegment list) { - return MemorySegment.NULL; + protected static MemorySegment first(MemorySegment ls) { + UiList list = UiList.getList(ls); + if(list.size() == 0) { + return MemorySegment.NULL; + } + list.iter = 0; + return MemorySegment.ofAddress(1); // we use iter+1 as fake element pointer } - protected static MemorySegment get(MemorySegment list, int index) { - return MemorySegment.NULL; + protected static MemorySegment next(MemorySegment ls) { + UiList list = UiList.getList(ls); + if(list.iter >= list.size()) { + return MemorySegment.NULL; + } + list.iter++; + return MemorySegment.ofAddress(list.iter+1); // we use iter+1 as fake element pointer } - protected static int count(MemorySegment list) { - return 0; + protected static MemorySegment get(MemorySegment ls, int index) { + UiList list = UiList.getList(ls); + if(index >= list.size()) { + return MemorySegment.NULL; + } + list.iter = index; + return MemorySegment.ofAddress(list.iter+1); } + protected static int count(MemorySegment ls) { + UiList list = UiList.getList(ls); + return list.size(); + } } diff --git a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java index cacfb33..b044a5f 100644 --- a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java +++ b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java @@ -7,6 +7,12 @@ import static java.awt.SystemColor.window; public class Main implements Application{ public void startup() { UiObject window = UiObject.createWindow("Test Window"); + UiList mylist = window.list("mylist"); + mylist.add("Test1"); + mylist.add("Test2"); + mylist.add("Test3"); + mylist.add("Test4"); + Button.button(window).label("Click Me").onClick(event -> { System.out.println("Clicked"); }).create(); @@ -20,6 +26,9 @@ public class Main implements Application{ Button.button(window).label("B3").create(); Container.vbox(window).create(() -> { Button.button(window).label("Test").create(); + ListView.list(window).varname("mylist").getvalue((elm, col) -> { + return elm; + }).create(); }); }