]> uap-core.de Git - rssreader.git/commitdiff
implement sourcelist eventhandling
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 13 Jul 2025 12:51:57 +0000 (14:51 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 13 Jul 2025 12:51:57 +0000 (14:51 +0200)
ui-java/src/main/java/de/unixwork/ui/Event.java
ui-java/src/main/java/de/unixwork/ui/EventDataType.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/SourceListBuilder.java
ui-java/src/main/java/de/unixwork/ui/SubListEventData.java [new file with mode: 0644]
ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java
ui-java/src/test/java/de/unixwork/ui/demo/Main.java

index 156674e6d1b69b116ace85c610c5e39d84c87fa7..d2b8507e198730fbcf04dc501908f0f89e960bed 100644 (file)
@@ -6,12 +6,14 @@ public class Event {
     private UiObject object;
     private Document document;
     private Object windowData;
-    private Object eventdata;
+    private Object eventData;
     private int intval;
     private int set;
 
     private MemorySegment windowPtr;
     private MemorySegment documentPtr;
+    private MemorySegment eventDataPtr;
+    private EventDataType eventDataType;
 
     public Event() {
 
@@ -34,6 +36,23 @@ public class Event {
 
             intval = (int)ui.event_get_int.invoke(eventPtr);
             set = (int)ui.event_get_set.invoke(eventPtr);
+
+            eventDataPtr = (MemorySegment)ui.event_get_eventdata.invoke(eventPtr);
+            int type = (int)ui.event_get_eventdatatype.invoke(eventPtr);
+            eventDataType = EventDataType.fromValue(type);
+
+            if(eventDataPtr != MemorySegment.NULL) {
+                switch(eventDataType) {
+                    case EventDataType.STRING: {
+                        eventData = eventDataPtr.getString(0);
+                        break;
+                    }
+                    case EventDataType.SUBLIST: {
+                        eventData = new SubListEventData(eventDataPtr);
+                        break;
+                    }
+                }
+            }
         } catch (Throwable e) {
             throw new RuntimeException(e);
         }
@@ -43,24 +62,51 @@ public class Event {
         return object;
     }
 
+    public void setObject(UiObject object) {
+        this.object = object;
+    }
+
     public Document getDocumemt() {
         return document;
     }
 
+    public void setDocument(Document document) {
+        this.document = document;
+    }
+
     public Object getWindowData() {
         return windowData;
     }
 
-    public Object getEventdata() {
-        return eventdata;
+    public void setWindowData(Object windowData) {
+        this.windowData = windowData;
+    }
+
+    public Object getEventData() {
+        return eventData;
+    }
+
+    public void setEventData(Object eventdata, EventDataType type) {
+        this.eventData = eventdata;
+        this.eventDataType = type;
+    }
+
+    public EventDataType getEventDataType() {
+        return eventDataType;
     }
 
     public int getIntValue() {
         return intval;
     }
 
+    public void setIntValue(int intval) {
+        this.intval = intval;
+    }
+
     public int getSet() { return set; }
 
+    public void setSet(int set) { this.set = set; }
+
     public MemorySegment getWindowPtr() {
         return windowPtr;
     }
@@ -68,4 +114,19 @@ public class Event {
     public MemorySegment getDocumentPtr() {
         return documentPtr;
     }
+
+
+    public String getStringData() {
+        if (eventDataType == EventDataType.STRING) {
+            return (String)eventData;
+        }
+        return null;
+    }
+
+    public SubListEventData getSubListEventData() {
+        if (eventDataType == EventDataType.SUBLIST) {
+            return (SubListEventData)eventData;
+        }
+        return null;
+    }
 }
diff --git a/ui-java/src/main/java/de/unixwork/ui/EventDataType.java b/ui-java/src/main/java/de/unixwork/ui/EventDataType.java
new file mode 100644 (file)
index 0000000..7730867
--- /dev/null
@@ -0,0 +1,37 @@
+package de.unixwork.ui;
+
+public enum EventDataType {
+    NULL(0),
+    POINTER(1),
+    STRING(2),
+    INTEGER_VALUE(3),
+    STRING_VALUE(4),
+    TEXT_VALUE(5),
+    DOUBLE_VALUE(6),
+    RANGE_VALUE(7),
+    LIST_SELECTION(8),
+    LIST_ELM(9),
+    DND(10),
+    SUBLIST(11),
+    FILE_LIST(12),
+    UNKNOWN(-1);
+
+    private final int value;
+
+    EventDataType(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static EventDataType fromValue(int value) {
+        for (EventDataType type : values()) {
+            if (type.value == value) {
+                return type;
+            }
+        }
+        return EventDataType.UNKNOWN;
+    }
+}
\ No newline at end of file
index ede0a662515a2a1f069a144ad8d45bdac4a7818f..ddc5f24de5552d2fd49d11b4aaac96f06353e7e0 100644 (file)
@@ -172,6 +172,18 @@ public class SourceListBuilder<T> extends AbstractWidgetBuilder {
         } else {
             throw new IllegalArgumentException("getvalue must be set");
         }
+        if(onActivate != null) {
+            EventWrapper event = new EventWrapper(obj, onActivate);
+            // set toolkit args
+            ui.sourcelist_args_set_onactivate.invoke(args, event.getCallback());
+            ui.sourcelist_args_set_onactivatedata.invoke(args, event.getUserData());
+        }
+        if(onButtonClick != null) {
+            EventWrapper event = new EventWrapper(obj, onButtonClick);
+            // set toolkit args
+            ui.sourcelist_args_set_onbuttonclick.invoke(args, event.getCallback());
+            ui.sourcelist_args_set_onbuttonclickdata.invoke(args, event.getUserData());
+        }
 
         return args;
     }
diff --git a/ui-java/src/main/java/de/unixwork/ui/SubListEventData.java b/ui-java/src/main/java/de/unixwork/ui/SubListEventData.java
new file mode 100644 (file)
index 0000000..0f433e2
--- /dev/null
@@ -0,0 +1,50 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.MemorySegment;
+
+public class SubListEventData {
+    private UiList list;
+    private int sublistIndex;
+    private int rowIndex;
+
+    public SubListEventData() {
+
+    }
+
+    protected SubListEventData(MemorySegment ptr) {
+        ToolkitFuncs ui = ToolkitFuncs.getInstance();
+
+        try {
+            MemorySegment listPtr = (MemorySegment)ui.sublist_event_get_list.invoke(ptr);
+            list = Toolkit.listPtrToObject(listPtr);
+            sublistIndex = (int)ui.sublist_event_get_sublist_index.invoke(ptr);
+            rowIndex = (int)ui.sublist_event_get_row_index.invoke(ptr);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public UiList getList() {
+        return list;
+    }
+
+    public void setList(UiList list) {
+        this.list = list;
+    }
+
+    public int getSublistIndex() {
+        return sublistIndex;
+    }
+
+    public void setSublistIndex(int sublistIndex) {
+        this.sublistIndex = sublistIndex;
+    }
+
+    public int getRowIndex() {
+        return rowIndex;
+    }
+
+    public void setRowIndex(int rowIndex) {
+        this.rowIndex = rowIndex;
+    }
+}
index cdf81272cb32a17e7aac3f5575bd0180f3940da0..cab31f3caea16d62a604431d3e1c5f1fc9a141be 100644 (file)
@@ -19,6 +19,7 @@ public class ToolkitFuncs {
     public MethodHandle event_get_document;
     public MethodHandle event_get_windowdata;
     public MethodHandle event_get_eventdata;
+    public MethodHandle event_get_eventdatatype;
     public MethodHandle event_get_int;
     public MethodHandle event_get_set;
 
@@ -37,6 +38,10 @@ public class ToolkitFuncs {
     public MethodHandle sublist_item_set_badge;
     public MethodHandle sublist_item_set_eventdata;
 
+    public MethodHandle sublist_event_get_list;
+    public MethodHandle sublist_event_get_sublist_index;
+    public MethodHandle sublist_event_get_row_index;
+
     public MethodHandle string_new;
     public MethodHandle int_new;
     public MethodHandle double_new;
@@ -82,6 +87,7 @@ public class ToolkitFuncs {
         MemorySegment event_get_document_addr = lib.find("ui_event_get_document").orElseThrow();
         MemorySegment event_get_windowdata_addr = lib.find("ui_event_get_windowdata").orElseThrow();
         MemorySegment event_get_eventdata_addr = lib.find("ui_event_get_eventdata").orElseThrow();
+        MemorySegment event_get_eventdatatype_addr = lib.find("ui_event_get_eventdatatype").orElseThrow();
         MemorySegment event_get_int_addr = lib.find("ui_event_get_int").orElseThrow();
         MemorySegment event_get_set_addr = lib.find("ui_event_get_set").orElseThrow();
 
@@ -100,6 +106,10 @@ public class ToolkitFuncs {
         MemorySegment sublist_item_set_badge_addr = lib.find("ui_sublist_item_set_badge").orElseThrow();
         MemorySegment sublist_item_set_eventdata_addr = lib.find("ui_sublist_item_set_eventdata").orElseThrow();
 
+        MemorySegment sublist_event_get_list_addr = lib.find("ui_sublist_event_get_list").orElseThrow();
+        MemorySegment sublist_event_get_sublist_index_addr = lib.find("ui_sublist_event_get_sublist_index").orElseThrow();
+        MemorySegment sublist_event_get_row_index_addr = lib.find("ui_sublist_event_get_row_index").orElseThrow();
+
         MemorySegment string_new_addr = lib.find("ui_string_new").orElseThrow();
         MemorySegment int_new_addr = lib.find("ui_int_new").orElseThrow();
         MemorySegment double_new_addr = lib.find("ui_double_new").orElseThrow();
@@ -135,6 +145,7 @@ public class ToolkitFuncs {
         event_get_document = linker.downcallHandle(event_get_document_addr, sigm_m);
         event_get_windowdata = linker.downcallHandle(event_get_windowdata_addr, sigm_m);
         event_get_eventdata = linker.downcallHandle(event_get_eventdata_addr, sigm_m);
+        event_get_eventdatatype = linker.downcallHandle(event_get_eventdatatype_addr, sigi_m);
         event_get_int = linker.downcallHandle(event_get_int_addr, sigi_m);
         event_get_set = linker.downcallHandle(event_get_set_addr, sigi_m);
 
@@ -153,6 +164,10 @@ public class ToolkitFuncs {
         sublist_item_set_badge = linker.downcallHandle(sublist_item_set_badge_addr, sigv_mm);
         sublist_item_set_eventdata = linker.downcallHandle(sublist_item_set_eventdata_addr, sigv_mm);
 
+        sublist_event_get_list = linker.downcallHandle(sublist_event_get_list_addr, sigm_m);
+        sublist_event_get_sublist_index = linker.downcallHandle(sublist_event_get_sublist_index_addr, sigi_m);
+        sublist_event_get_row_index = linker.downcallHandle(sublist_event_get_row_index_addr, sigi_m);
+
         string_new = linker.downcallHandle(string_new_addr, sigm_mm);
         int_new = linker.downcallHandle(int_new_addr, sigm_mm);
         double_new = linker.downcallHandle(double_new_addr, sigm_mm);
index 19f453c322f6ccce60ba7ca5e4fe3286104def44..9210823a83d8fcb0e0b3670449d2c27513ae644c 100644 (file)
@@ -36,7 +36,10 @@ public class Main implements Application{
 
         ListView.<String>sourcelist(window).dynamicSublists(src).fill(true).getvalue((elm) -> {
             return new SubListItem(elm);
-        }).create();
+        }).onActivate((event -> {
+            SubListEventData data = event.getSubListEventData();
+            System.out.println("sourcelist activate: " + data.getList().get(data.getRowIndex()));
+        })).create();
 
 
         /*