Mercurial > dwindows
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); }