comparison android/DWindows.kt @ 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 8a4f162810c2
comparison
equal deleted inserted replaced
2784:cccbb367bcd3 2785:220d63da2183
165 isSelected = false 165 isSelected = false
166 } 166 }
167 } 167 }
168 168
169 169
170 class DWTreeItemView : LinearLayout { 170 class DWTreeItemView : LinearLayout, Checkable {
171 private var mChecked = false
172 private var colorSelection = Color.DKGRAY
171 var expandCollapseView: ImageView = ImageView(context) 173 var expandCollapseView: ImageView = ImageView(context)
172 var iconView: ImageView = ImageView(context) 174 var iconView: ImageView = ImageView(context)
173 var textView: TextView = TextView(context) 175 var textView: TextView = TextView(context)
176
177 fun updateBackground() {
178 if(mChecked) {
179 this.setBackgroundColor(colorSelection)
180 } else {
181 this.setBackgroundColor(Color.TRANSPARENT)
182 }
183 }
184
185 override fun setChecked(b: Boolean) {
186 mChecked = b
187 updateBackground()
188 }
189
190 override fun isChecked(): Boolean {
191 return mChecked
192 }
193
194 override fun toggle() {
195 mChecked = !mChecked
196 updateBackground()
197 }
174 198
175 fun setup(context: Context?) { 199 fun setup(context: Context?) {
176 var params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) 200 var params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
177 this.orientation = LinearLayout.HORIZONTAL 201 this.orientation = LinearLayout.HORIZONTAL
178 params.gravity = Gravity.CENTER 202 params.gravity = Gravity.CENTER
185 params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT) 209 params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
186 params.gravity = Gravity.CENTER 210 params.gravity = Gravity.CENTER
187 textView.layoutParams = params 211 textView.layoutParams = params
188 textView.id = View.generateViewId() 212 textView.id = View.generateViewId()
189 this.addView(textView) 213 this.addView(textView)
214 colorSelection = context?.let { getPlatformSelectionColor(it) }!!
190 } 215 }
191 216
192 constructor(context: Context?) : super(context) { 217 constructor(context: Context?) : super(context) {
193 setup(context) 218 setup(context)
194 } 219 }
425 // Here you can bind your node and check if it selected or not 450 // Here you can bind your node and check if it selected or not
426 } 451 }
427 } 452 }
428 453
429 class DWTreeViewAdapter : RecyclerView.Adapter<DWTreeViewHolder> { 454 class DWTreeViewAdapter : RecyclerView.Adapter<DWTreeViewHolder> {
430 // Interface definition for a callback to be invoked when a DWTreeItem has been clicked and held.
431 interface OnTreeItemClickListener {
432 // Called when a DWTreeItem has been clicked.
433 // @param treeItem The current clicked node
434 // @param view The view that was clicked and held.
435 fun onTreeItemClick(treeItem: DWTreeItem?, view: View?)
436 }
437
438 // Interface definition for a callback to be invoked when a DWTreeItem has been clicked and held.
439 interface OnTreeItemLongClickListener {
440 // Called when a TreeItem has been clicked and held.
441 // @param treeItem The current clicked node
442 // @param view The view that was clicked and held.
443 // @return true if the callback consumed the long click, false otherwise.
444 fun onTreeItemLongClick(treeItem: DWTreeItem?, view: View?): Boolean
445 }
446
447 // Manager class for TreeItems to easily apply operations on them 455 // Manager class for TreeItems to easily apply operations on them
448 // and to make it easy for testing and extending 456 // and to make it easy for testing and extending
449 private val treeItemManager: DWTreeItemManager 457 private val treeItemManager: DWTreeItemManager
450 458
451 // A ViewHolder Factory to get DWTreeViewHolder object that mapped with layout 459 // A ViewHolder Factory to get DWTreeViewHolder object that mapped with layout
453 461
454 // The current selected Tree Item 462 // The current selected Tree Item
455 private var currentSelectedItem: DWTreeItem? = null 463 private var currentSelectedItem: DWTreeItem? = null
456 464
457 // Custom OnClickListener to be invoked when a DWTreeItem has been clicked. 465 // Custom OnClickListener to be invoked when a DWTreeItem has been clicked.
458 private var treeItemClickListener: OnTreeItemClickListener? = null 466 private var treeItemClickListener: ((DWTreeItem?, View?) -> Boolean)? = null
459 467
460 // Custom OnLongClickListener to be invoked when a DWTreeItem has been clicked and hold. 468 // Custom OnLongClickListener to be invoked when a DWTreeItem has been clicked and hold.
461 private var treeItemLongClickListener: OnTreeItemLongClickListener? = null 469 private var treeItemLongClickListener: ((DWTreeItem?, View?) -> Boolean)? = null
470
471 // Custom OnListener to be invoked when a DWTreeItem has been expanded.
472 private var treeItemExpandListener: ((DWTreeItem?, View?) -> Boolean)? = null
462 473
463 // Simple constructor 474 // Simple constructor
464 // @param factory a View Holder Factory mapped with layout id's 475 // @param factory a View Holder Factory mapped with layout id's
465 constructor(factory: DWTreeViewHolderFactory) { 476 constructor(factory: DWTreeViewHolderFactory) {
466 treeViewHolderFactory = factory 477 treeViewHolderFactory = factory
492 // Handle node expand and collapse event 503 // Handle node expand and collapse event
493 if (!currentNode.getChildren().isEmpty()) { 504 if (!currentNode.getChildren().isEmpty()) {
494 val isNodeExpanded: Boolean = currentNode.isExpanded() 505 val isNodeExpanded: Boolean = currentNode.isExpanded()
495 if (isNodeExpanded) collapseNode(currentNode) else expandNode(currentNode) 506 if (isNodeExpanded) collapseNode(currentNode) else expandNode(currentNode)
496 currentNode.setExpanded(!isNodeExpanded) 507 currentNode.setExpanded(!isNodeExpanded)
508 // Handle DWTreeItem expand listener event
509 if (!isNodeExpanded && treeItemExpandListener != null) treeItemExpandListener!!(
510 currentNode,
511 v
512 )
497 } 513 }
498 notifyDataSetChanged() 514 notifyDataSetChanged()
499 515
500 // Handle DWTreeItem click listener event 516 // Handle DWTreeItem click listener event
501 if (treeItemClickListener != null) treeItemClickListener!!.onTreeItemClick( 517 if (treeItemClickListener != null) treeItemClickListener!!(
502 currentNode, 518 currentNode,
503 v 519 v
504 ) 520 )
505 } 521 }
506 522
507 // Handle DWTreeItem long click listener event 523 // Handle DWTreeItem long click listener event
508 holder.itemView.setOnLongClickListener { v -> 524 holder.itemView.setOnLongClickListener { v ->
509 if (treeItemLongClickListener != null) { 525 if (treeItemLongClickListener != null) {
510 return@setOnLongClickListener treeItemLongClickListener!!.onTreeItemLongClick( 526 return@setOnLongClickListener treeItemLongClickListener!!(
511 currentNode, 527 currentNode,
512 v 528 v
513 ) 529 )
514 } 530 }
515 true 531 true
596 notifyDataSetChanged() 612 notifyDataSetChanged()
597 } 613 }
598 614
599 // Register a callback to be invoked when this DWTreeItem is clicked 615 // Register a callback to be invoked when this DWTreeItem is clicked
600 // @param listener The callback that will run 616 // @param listener The callback that will run
601 fun setTreeItemClickListener(listener: OnTreeItemClickListener?) { 617 fun setTreeItemClickListener(listener: (DWTreeItem?, View?) -> Boolean) {
602 treeItemClickListener = listener 618 treeItemClickListener = listener
603 } 619 }
604 620
605 // Register a callback to be invoked when this DWTreeItem is clicked and held 621 // Register a callback to be invoked when this DWTreeItem is clicked and held
606 // @param listener The callback that will run 622 // @param listener The callback that will run
607 fun setTreeItemLongClickListener(listener: OnTreeItemLongClickListener?) { 623 fun setTreeItemLongClickListener(listener: (DWTreeItem?, View?) -> Boolean) {
608 treeItemLongClickListener = listener 624 treeItemLongClickListener = listener
625 }
626
627 // Register a callback to be invoked when this DWTreeItem is expanded
628 // @param listener The callback that will run
629 fun setTreeItemExpandListener(listener: (DWTreeItem?, View?) -> Boolean) {
630 treeItemExpandListener = listener
609 } 631 }
610 632
611 // @return The current selected DWTreeItem 633 // @return The current selected DWTreeItem
612 val selectedNode: DWTreeItem? 634 val selectedNode: DWTreeItem?
613 get() = currentSelectedItem 635 get() = currentSelectedItem
4584 val treeViewAdapter = DWTreeViewAdapter(factory) 4606 val treeViewAdapter = DWTreeViewAdapter(factory)
4585 tree!!.tag = dataArrayMap 4607 tree!!.tag = dataArrayMap
4586 tree!!.id = cid 4608 tree!!.id = cid
4587 tree!!.adapter = treeViewAdapter 4609 tree!!.adapter = treeViewAdapter
4588 tree!!.layoutManager = LinearLayoutManager(this) 4610 tree!!.layoutManager = LinearLayoutManager(this)
4611 treeViewAdapter.setTreeItemLongClickListener { treeitem: DWTreeItem?, view: View? ->
4612 if(treeitem != null) {
4613 eventHandlerTree(tree!!, DWEvent.ITEM_CONTEXT, treeitem,
4614 treeitem.getTitle(), treeitem.getData())
4615 }
4616 true
4617 }
4618 treeViewAdapter.setTreeItemClickListener { treeitem: DWTreeItem?, view: View? ->
4619 if(treeitem != null) {
4620 eventHandlerTree(tree!!, DWEvent.ITEM_SELECT, treeitem,
4621 treeitem.getTitle(), treeitem.getData())
4622 }
4623 true
4624 }
4625 treeViewAdapter.setTreeItemExpandListener { treeitem: DWTreeItem?, view: View? ->
4626 if(treeitem != null) {
4627 eventHandlerTreeItem(tree!!, DWEvent.TREE_EXPAND, treeitem)
4628 }
4629 true
4630 }
4589 } 4631 }
4590 } 4632 }
4591 return tree 4633 return tree
4592 } 4634 }
4593 4635
6467 external fun eventHandlerSimple(obj1: View, message: Int) 6509 external fun eventHandlerSimple(obj1: View, message: Int)
6468 external fun eventHandlerNotebook(obj1: View, message: Int, pageID: Long) 6510 external fun eventHandlerNotebook(obj1: View, message: Int, pageID: Long)
6469 external fun eventHandlerTimer(sigfunc: Long, data: Long): Int 6511 external fun eventHandlerTimer(sigfunc: Long, data: Long): Int
6470 external fun eventHandlerHTMLResult(obj1: View, message: Int, result: String, data: Long) 6512 external fun eventHandlerHTMLResult(obj1: View, message: Int, result: String, data: Long)
6471 external fun eventHandlerContainer(obj1: View, message: Int, title: String?, x: Int, y: Int, data: Long) 6513 external fun eventHandlerContainer(obj1: View, message: Int, title: String?, x: Int, y: Int, data: Long)
6514 external fun eventHandlerTree(obj1: View, message: Int, item: DWTreeItem?, title: String?, data: Long)
6515 external fun eventHandlerTreeItem(obj1: View, message: Int, item: DWTreeItem?)
6472 external fun eventHandlerKey(obj1: View, message: Int, character: Int, vk: Int, modifiers: Int, str: String) 6516 external fun eventHandlerKey(obj1: View, message: Int, character: Int, vk: Int, modifiers: Int, str: String)
6473 6517
6474 companion object 6518 companion object
6475 { 6519 {
6476 // Used to load the 'dwindows' library on application startup. 6520 // Used to load the 'dwindows' library on application startup.