comparison android/DWindows.kt @ 2614:dbcd9416e9c9

Android: Popup menus on Andoird use an anchor View not the touch location. The parent parameter passed probably will not be the ideal anchor. The two options are to hit test the touch event coordinates of the x/y parameters. Or, the solution I did in this commit, saving the View of the last click event and if it is valid, use that View as the anchor. This works well in the test program but may need to revisit this later.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 23 Jul 2021 14:52:32 +0000
parents 72f1141c07aa
children dcd71b04cc46
comparison
equal deleted inserted replaced
2613:72f1141c07aa 2614:dbcd9416e9c9
741 var windowLayout: LinearLayout? = null 741 var windowLayout: LinearLayout? = null
742 var threadLock = ReentrantLock() 742 var threadLock = ReentrantLock()
743 var threadCond = threadLock.newCondition() 743 var threadCond = threadLock.newCondition()
744 var notificationID: Int = 0 744 var notificationID: Int = 0
745 var darkMode: Int = -1 745 var darkMode: Int = -1
746 var lastClickView: View? = null
746 private var paint = Paint() 747 private var paint = Paint()
747 private var bgcolor: Int = 0 748 private var bgcolor: Int = 0
748 private var menuBar: DWMenu? = null 749 private var menuBar: DWMenu? = null
749 private var defaultItem: View? = null 750 private var defaultItem: View? = null
750 private var fileURI: Uri? = null 751 private var fileURI: Uri? = null
836 return darkMode 837 return darkMode
837 } 838 }
838 839
839 fun menuPopup(menu: DWMenu, parent: View, x: Int, y: Int) 840 fun menuPopup(menu: DWMenu, parent: View, x: Int, y: Int)
840 { 841 {
842 var anchor: View? = parent
843
844 // If lastClickView is valid, use that instead of parent
845 if(lastClickView != null) {
846 anchor = lastClickView
847 }
848
841 runOnUiThread { 849 runOnUiThread {
842 val popup = PopupMenu(this, parent) 850 val popup = PopupMenu(this, anchor)
843 851
844 menu.createMenu(popup.menu) 852 menu.createMenu(popup.menu)
845 popup.show() 853 popup.show()
846 } 854 }
847 } 855 }
1415 button!!.tag = dataArrayMap 1423 button!!.tag = dataArrayMap
1416 button!!.isAllCaps = false 1424 button!!.isAllCaps = false
1417 button!!.text = text 1425 button!!.text = text
1418 button!!.id = cid 1426 button!!.id = cid
1419 button!!.setOnClickListener { 1427 button!!.setOnClickListener {
1428 lastClickView = button!!
1420 eventHandlerSimple(button!!, 8) 1429 eventHandlerSimple(button!!, 8)
1421 } 1430 }
1422 } 1431 }
1423 return button 1432 return button
1424 } 1433 }
1431 1440
1432 button!!.tag = dataArrayMap 1441 button!!.tag = dataArrayMap
1433 button!!.id = resid 1442 button!!.id = resid
1434 button!!.setImageResource(resid) 1443 button!!.setImageResource(resid)
1435 button!!.setOnClickListener { 1444 button!!.setOnClickListener {
1445 lastClickView = button!!
1436 eventHandlerSimple(button!!, 8) 1446 eventHandlerSimple(button!!, 8)
1437 } 1447 }
1438 } 1448 }
1439 return button 1449 return button
1440 } 1450 }
1447 val exts = arrayOf("", ".png", ".webp", ".jpg", ".jpeg", ".gif") 1457 val exts = arrayOf("", ".png", ".webp", ".jpg", ".jpeg", ".gif")
1448 1458
1449 button!!.tag = dataArrayMap 1459 button!!.tag = dataArrayMap
1450 button!!.id = cid 1460 button!!.id = cid
1451 button!!.setOnClickListener { 1461 button!!.setOnClickListener {
1462 lastClickView = button!!
1452 eventHandlerSimple(button!!, 8) 1463 eventHandlerSimple(button!!, 8)
1453 } 1464 }
1454 1465
1455 for (ext in exts) { 1466 for (ext in exts) {
1456 // Try to load the image, and protect against exceptions 1467 // Try to load the image, and protect against exceptions
1477 val b = BitmapFactory.decodeByteArray(data,0, length) 1488 val b = BitmapFactory.decodeByteArray(data,0, length)
1478 1489
1479 button!!.tag = dataArrayMap 1490 button!!.tag = dataArrayMap
1480 button!!.id = cid 1491 button!!.id = cid
1481 button!!.setOnClickListener { 1492 button!!.setOnClickListener {
1493 lastClickView = button!!
1482 eventHandlerSimple(button!!, 8) 1494 eventHandlerSimple(button!!, 8)
1483 } 1495 }
1484 button!!.setImageBitmap(b) 1496 button!!.setImageBitmap(b)
1485 } 1497 }
1486 return button 1498 return button
1519 1531
1520 radiobutton!!.tag = dataArrayMap 1532 radiobutton!!.tag = dataArrayMap
1521 radiobutton!!.id = cid 1533 radiobutton!!.id = cid
1522 radiobutton!!.text = text 1534 radiobutton!!.text = text
1523 radiobutton!!.setOnClickListener { 1535 radiobutton!!.setOnClickListener {
1536 lastClickView = radiobutton!!
1524 eventHandlerSimple(radiobutton!!, 8) 1537 eventHandlerSimple(radiobutton!!, 8)
1525 } 1538 }
1526 } 1539 }
1527 return radiobutton 1540 return radiobutton
1528 } 1541 }
1536 checkbox = CheckBox(this) 1549 checkbox = CheckBox(this)
1537 checkbox!!.tag = dataArrayMap 1550 checkbox!!.tag = dataArrayMap
1538 checkbox!!.id = cid 1551 checkbox!!.id = cid
1539 checkbox!!.text = text 1552 checkbox!!.text = text
1540 checkbox!!.setOnClickListener { 1553 checkbox!!.setOnClickListener {
1554 lastClickView = checkbox!!
1541 eventHandlerSimple(checkbox!!, 8) 1555 eventHandlerSimple(checkbox!!, 8)
1542 } 1556 }
1543 } 1557 }
1544 return checkbox 1558 return checkbox
1545 } 1559 }
2151 val data = adapter.model.getRowData(position) 2165 val data = adapter.model.getRowData(position)
2152 val now = System.currentTimeMillis() 2166 val now = System.currentTimeMillis()
2153 2167
2154 view.isSelected = !view.isSelected 2168 view.isSelected = !view.isSelected
2155 adapter.selectedItem = position 2169 adapter.selectedItem = position
2170 lastClickView = cont!!
2156 // If we are single select or we got a double tap... 2171 // If we are single select or we got a double tap...
2157 // Generate an ENTER event 2172 // Generate an ENTER event
2158 if(cont!!.choiceMode != ListView.CHOICE_MODE_MULTIPLE || 2173 if(cont!!.choiceMode != ListView.CHOICE_MODE_MULTIPLE ||
2159 (position == adapter.lastClickRow && 2174 (position == adapter.lastClickRow &&
2160 (now - adapter.lastClick) < ViewConfiguration.getDoubleTapTimeout())) { 2175 (now - adapter.lastClick) < ViewConfiguration.getDoubleTapTimeout())) {
2169 cont!!.setOnContextClickListener { 2184 cont!!.setOnContextClickListener {
2170 if(adapter.selectedItem > -1 && adapter.selectedItem < adapter.model.numberOfRows()) { 2185 if(adapter.selectedItem > -1 && adapter.selectedItem < adapter.model.numberOfRows()) {
2171 val title = adapter.model.getRowTitle(adapter.selectedItem) 2186 val title = adapter.model.getRowTitle(adapter.selectedItem)
2172 val data = adapter.model.getRowData(adapter.selectedItem) 2187 val data = adapter.model.getRowData(adapter.selectedItem)
2173 2188
2189 lastClickView = cont!!
2174 eventHandlerContainer(cont!!, 10, title, 0, 0, data) 2190 eventHandlerContainer(cont!!, 10, title, 0, 0, data)
2175 } 2191 }
2176 true 2192 true
2177 } 2193 }
2178 cont!!.setOnItemLongClickListener { parent, view, position, id -> 2194 cont!!.setOnItemLongClickListener { parent, view, position, id ->
2179 val title = adapter.model.getRowTitle(position) 2195 val title = adapter.model.getRowTitle(position)
2180 val data = adapter.model.getRowData(position) 2196 val data = adapter.model.getRowData(position)
2181 2197
2198 lastClickView = cont!!
2182 eventHandlerContainer(cont!!, 10, title, 0, 0, data) 2199 eventHandlerContainer(cont!!, 10, title, 0, 0, data)
2183 true 2200 true
2184 } 2201 }
2185 } 2202 }
2186 return cont 2203 return cont
2900 // onLongClickListener below, just save the location 2917 // onLongClickListener below, just save the location
2901 } 2918 }
2902 MotionEvent.ACTION_UP -> { 2919 MotionEvent.ACTION_UP -> {
2903 render!!.evx = event.x 2920 render!!.evx = event.x
2904 render!!.evy = event.y 2921 render!!.evy = event.y
2922 lastClickView = render!!
2905 eventHandlerInt(render!!, 4, event.x.toInt(), event.y.toInt(), render!!.button, 0) 2923 eventHandlerInt(render!!, 4, event.x.toInt(), event.y.toInt(), render!!.button, 0)
2906 } 2924 }
2907 MotionEvent.ACTION_MOVE -> { 2925 MotionEvent.ACTION_MOVE -> {
2908 render!!.evx = event.x 2926 render!!.evx = event.x
2909 render!!.evy = event.y 2927 render!!.evy = event.y
2928 lastClickView = render!!
2910 eventHandlerInt(render!!, 5, event.x.toInt(), event.y.toInt(), 1, 0) 2929 eventHandlerInt(render!!, 5, event.x.toInt(), event.y.toInt(), 1, 0)
2911 } 2930 }
2912 } 2931 }
2913 return false 2932 return false
2914 } 2933 }
2915 }) 2934 })
2916 render!!.setOnLongClickListener{ 2935 render!!.setOnLongClickListener{
2917 // Long click functions as button 2 2936 // Long click functions as button 2
2918 render!!.button = 2 2937 render!!.button = 2
2938 lastClickView = render!!
2919 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0) 2939 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0)
2920 true 2940 true
2921 } 2941 }
2922 render!!.setOnClickListener{ 2942 render!!.setOnClickListener{
2923 // Normal click functions as button 1 2943 // Normal click functions as button 1
2924 render!!.button = 1 2944 render!!.button = 1
2945 lastClickView = render!!
2925 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0) 2946 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0)
2926 } 2947 }
2927 render!!.setOnKeyListener(View.OnKeyListener { v, keyCode, event -> 2948 render!!.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
2928 if (event.action == KeyEvent.ACTION_DOWN) { 2949 if (event.action == KeyEvent.ACTION_DOWN) {
2929 eventHandlerKey(render!!, 2, keyCode, event.unicodeChar, event.modifiers, event.characters) 2950 eventHandlerKey(render!!, 2, keyCode, event.unicodeChar, event.modifiers, event.characters)