Mercurial > dwindows
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. |