changeset 2785:220d63da2183

Android: Implement ITEM_CONTEXT, ITEM_SELECT and TREE_EXPAND callbacks.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 10 Jul 2022 09:53:19 +0000
parents cccbb367bcd3
children 3934ac8b394c
files android/DWindows.kt android/dw.cpp
diffstat 2 files changed, 96 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/android/DWindows.kt	Thu Jul 07 23:04:27 2022 +0000
+++ b/android/DWindows.kt	Sun Jul 10 09:53:19 2022 +0000
@@ -167,11 +167,35 @@
 }
 
 
-class DWTreeItemView : LinearLayout {
+class DWTreeItemView : LinearLayout, Checkable {
+    private var mChecked = false
+    private var colorSelection = Color.DKGRAY
     var expandCollapseView: ImageView = ImageView(context)
     var iconView: ImageView = ImageView(context)
     var textView: TextView = TextView(context)
 
+    fun updateBackground() {
+        if(mChecked) {
+            this.setBackgroundColor(colorSelection)
+        } else {
+            this.setBackgroundColor(Color.TRANSPARENT)
+        }
+    }
+
+    override fun setChecked(b: Boolean) {
+        mChecked = b
+        updateBackground()
+    }
+
+    override fun isChecked(): Boolean {
+        return mChecked
+    }
+
+    override fun toggle() {
+        mChecked = !mChecked
+        updateBackground()
+    }
+
     fun setup(context: Context?) {
         var params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
         this.orientation = LinearLayout.HORIZONTAL
@@ -187,6 +211,7 @@
         textView.layoutParams = params
         textView.id = View.generateViewId()
         this.addView(textView)
+        colorSelection = context?.let { getPlatformSelectionColor(it) }!!
     }
 
     constructor(context: Context?) : super(context) {
@@ -427,23 +452,6 @@
 }
 
 class DWTreeViewAdapter : RecyclerView.Adapter<DWTreeViewHolder> {
-    // Interface definition for a callback to be invoked when a DWTreeItem has been clicked and held.
-    interface OnTreeItemClickListener {
-        // Called when a DWTreeItem has been clicked.
-        // @param treeItem The current clicked node
-        // @param view The view that was clicked and held.
-        fun onTreeItemClick(treeItem: DWTreeItem?, view: View?)
-    }
-
-    // Interface definition for a callback to be invoked when a DWTreeItem has been clicked and held.
-    interface OnTreeItemLongClickListener {
-        // Called when a TreeItem has been clicked and held.
-        // @param treeItem The current clicked node
-        // @param view The view that was clicked and held.
-        // @return true if the callback consumed the long click, false otherwise.
-        fun onTreeItemLongClick(treeItem: DWTreeItem?, view: View?): Boolean
-    }
-
     // Manager class for TreeItems to easily apply operations on them
     // and to make it easy for testing and extending
     private val treeItemManager: DWTreeItemManager
@@ -455,10 +463,13 @@
     private var currentSelectedItem: DWTreeItem? = null
 
     // Custom OnClickListener to be invoked when a DWTreeItem has been clicked.
-    private var treeItemClickListener: OnTreeItemClickListener? = null
+    private var treeItemClickListener: ((DWTreeItem?, View?) -> Boolean)? = null
 
     // Custom OnLongClickListener to be invoked when a DWTreeItem has been clicked and hold.
-    private var treeItemLongClickListener: OnTreeItemLongClickListener? = null
+    private var treeItemLongClickListener: ((DWTreeItem?, View?) -> Boolean)? = null
+
+    // Custom OnListener to be invoked when a DWTreeItem has been expanded.
+    private var treeItemExpandListener: ((DWTreeItem?, View?) -> Boolean)? = null
 
     // Simple constructor
     // @param factory a View Holder Factory mapped with layout id's
@@ -494,11 +505,16 @@
                 val isNodeExpanded: Boolean = currentNode.isExpanded()
                 if (isNodeExpanded) collapseNode(currentNode) else expandNode(currentNode)
                 currentNode.setExpanded(!isNodeExpanded)
+                // Handle DWTreeItem expand listener event
+                if (!isNodeExpanded && treeItemExpandListener != null) treeItemExpandListener!!(
+                    currentNode,
+                    v
+                )
             }
             notifyDataSetChanged()
 
             // Handle DWTreeItem click listener event
-            if (treeItemClickListener != null) treeItemClickListener!!.onTreeItemClick(
+            if (treeItemClickListener != null) treeItemClickListener!!(
                 currentNode,
                 v
             )
@@ -507,7 +523,7 @@
         // Handle DWTreeItem long click listener event
         holder.itemView.setOnLongClickListener { v ->
             if (treeItemLongClickListener != null) {
-                return@setOnLongClickListener treeItemLongClickListener!!.onTreeItemLongClick(
+                return@setOnLongClickListener treeItemLongClickListener!!(
                     currentNode,
                     v
                 )
@@ -598,16 +614,22 @@
 
     // Register a callback to be invoked when this DWTreeItem is clicked
     // @param listener The callback that will run
-    fun setTreeItemClickListener(listener: OnTreeItemClickListener?) {
+    fun setTreeItemClickListener(listener: (DWTreeItem?, View?) -> Boolean) {
         treeItemClickListener = listener
     }
 
     // Register a callback to be invoked when this DWTreeItem is clicked and held
     // @param listener The callback that will run
-    fun setTreeItemLongClickListener(listener: OnTreeItemLongClickListener?) {
+    fun setTreeItemLongClickListener(listener: (DWTreeItem?, View?) -> Boolean) {
         treeItemLongClickListener = listener
     }
 
+    // Register a callback to be invoked when this DWTreeItem is expanded
+    // @param listener The callback that will run
+    fun setTreeItemExpandListener(listener: (DWTreeItem?, View?) -> Boolean) {
+        treeItemExpandListener = listener
+    }
+
     // @return The current selected DWTreeItem
     val selectedNode: DWTreeItem?
         get() = currentSelectedItem
@@ -4586,6 +4608,26 @@
                 tree!!.id = cid
                 tree!!.adapter = treeViewAdapter
                 tree!!.layoutManager = LinearLayoutManager(this)
+                treeViewAdapter.setTreeItemLongClickListener { treeitem: DWTreeItem?, view: View? ->
+                    if(treeitem != null) {
+                        eventHandlerTree(tree!!, DWEvent.ITEM_CONTEXT, treeitem,
+                            treeitem.getTitle(), treeitem.getData())
+                    }
+                    true
+                }
+                treeViewAdapter.setTreeItemClickListener { treeitem: DWTreeItem?, view: View? ->
+                    if(treeitem != null) {
+                        eventHandlerTree(tree!!, DWEvent.ITEM_SELECT, treeitem,
+                            treeitem.getTitle(), treeitem.getData())
+                    }
+                    true
+                }
+                treeViewAdapter.setTreeItemExpandListener { treeitem: DWTreeItem?, view: View? ->
+                    if(treeitem != null) {
+                        eventHandlerTreeItem(tree!!, DWEvent.TREE_EXPAND, treeitem)
+                    }
+                    true
+                }
             }
         }
         return tree
@@ -6469,6 +6511,8 @@
     external fun eventHandlerTimer(sigfunc: Long, data: Long): Int
     external fun eventHandlerHTMLResult(obj1: View, message: Int, result: String, data: Long)
     external fun eventHandlerContainer(obj1: View, message: Int, title: String?, x: Int, y: Int, data: Long)
+    external fun eventHandlerTree(obj1: View, message: Int, item: DWTreeItem?, title: String?, data: Long)
+    external fun eventHandlerTreeItem(obj1: View, message: Int, item: DWTreeItem?)
     external fun eventHandlerKey(obj1: View, message: Int, character: Int, vk: Int, modifiers: Int, str: String)
 
     companion object
--- a/android/dw.cpp	Thu Jul 07 23:04:27 2022 +0000
+++ b/android/dw.cpp	Sun Jul 10 09:53:19 2022 +0000
@@ -610,10 +610,10 @@
     const char *utf81 = str1 ? env->GetStringUTFChars(str1, nullptr) : nullptr;
     const char *utf82 = str2 ? env->GetStringUTFChars(str2, nullptr) : nullptr;
 #endif
-    void *params[_DW_EVENT_PARAM_SIZE] = { (void *)obj2, (void *)utf81, (void *)utf82,
-                                            DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb),
-                                            DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr,
-                                            DW_INT_TO_POINTER(message), nullptr };
+    void *params[_DW_EVENT_PARAM_SIZE] = { DW_POINTER(obj2), DW_POINTER(utf81), DW_POINTER(utf82),
+                                           DW_INT_TO_POINTER(inta), DW_INT_TO_POINTER(intb),
+                                           DW_INT_TO_POINTER(intc), DW_INT_TO_POINTER(intd), nullptr,
+                                           DW_INT_TO_POINTER(message), nullptr };
 
     return _dw_event_handler(obj1, params);
 }
@@ -775,7 +775,30 @@
     const char *title = jtitle ? env->GetStringUTFChars(jtitle, nullptr) : nullptr;
 #endif
     void *params[_DW_EVENT_PARAM_SIZE] = { nullptr, DW_POINTER(title), nullptr, DW_INT_TO_POINTER(x), DW_INT_TO_POINTER(y),
-                                           nullptr, nullptr, (void *)data, DW_INT_TO_POINTER(message), nullptr };
+                                           nullptr, nullptr, DW_POINTER(data), DW_INT_TO_POINTER(message), nullptr };
+
+    _dw_event_handler(obj1, params);
+}
+
+JNIEXPORT void JNICALL
+Java_org_dbsoft_dwindows_DWindows_eventHandlerTree(JNIEnv* env, jobject obj, jobject obj1,
+                                                   jint message, jobject item, jstring jtitle, jlong data) {
+#ifdef _DW_EVENT_THREADING
+    char *title = jtitle ? strdup(env->GetStringUTFChars(jtitle, nullptr)) : nullptr;
+#else
+    const char *title = jtitle ? env->GetStringUTFChars(jtitle, nullptr) : nullptr;
+#endif
+    void *params[_DW_EVENT_PARAM_SIZE] = { DW_POINTER(item), DW_POINTER(title), nullptr, nullptr, nullptr,
+                                           nullptr, nullptr, DW_POINTER(data), DW_INT_TO_POINTER(message), nullptr };
+
+    _dw_event_handler(obj1, params);
+}
+
+JNIEXPORT void JNICALL
+Java_org_dbsoft_dwindows_DWindows_eventHandlerTreeItem(JNIEnv* env, jobject obj, jobject obj1,
+                                                   jint message, jobject item) {
+    void *params[_DW_EVENT_PARAM_SIZE] = { DW_POINTER(item), nullptr, nullptr, nullptr, nullptr,
+                                           nullptr, nullptr, nullptr, DW_INT_TO_POINTER(message), nullptr };
 
     _dw_event_handler(obj1, params);
 }