diff android/DWindows.kt @ 2543:f9367eb9a6e7

Android: Initial menu support, incomplete but basics functional.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 13 May 2021 19:54:15 +0000
parents bb75e64e6138
children dbfcc0e357d6
line wrap: on
line diff
--- a/android/DWindows.kt	Thu May 13 07:43:31 2021 +0000
+++ b/android/DWindows.kt	Thu May 13 19:54:15 2021 +0000
@@ -25,11 +25,8 @@
 import android.util.Base64
 import android.util.Log
 import android.util.SparseBooleanArray
-import android.view.Gravity
-import android.view.MotionEvent
-import android.view.View
+import android.view.*
 import android.view.View.OnTouchListener
-import android.view.ViewGroup
 import android.view.inputmethod.EditorInfo
 import android.webkit.WebView
 import android.webkit.WebViewClient
@@ -397,6 +394,48 @@
     }
 }
 
+// On Android we can't pre-create submenus...
+// So create our own placeholder classes, and create the actual menus
+// on demand when required by Android
+class DWMenuItem
+{
+    var title: String? = null
+    var menu: DWMenu? = null
+    var submenu: DWMenu? = null
+    var checked: Boolean = false
+    var check: Boolean = false
+    var menuitem: MenuItem? = null
+    var submenuitem: SubMenu? = null
+    var id: Int = 0
+}
+
+class DWMenu {
+    var menu: Menu? = null
+    var children = mutableListOf<DWMenuItem>()
+    var id: Int = 0
+
+    fun createMenu(newmenu: Menu?) {
+        if(menu == null) {
+            menu = newmenu
+        }
+        if(menu != null) {
+            for (menuitem in children) {
+                // Submenus on Android can't have submenus, so stop at depth 1
+                if (menuitem.submenu != null && menu !is SubMenu) {
+                    if(menuitem.submenuitem == null) {
+                        menuitem.submenuitem = menu?.addSubMenu(0, menuitem.id, 0, menuitem.title)
+                    }
+                    menuitem.submenu!!.createMenu(menuitem.submenuitem)
+                } else if(menuitem.submenu == null) {
+                    if(menuitem.menuitem == null) {
+                        menuitem.menuitem = menu?.add(0, menuitem.id, 0, menuitem.title)
+                    }
+                }
+            }
+        }
+    }
+}
+
 class DWindows : AppCompatActivity() {
     var firstWindow: Boolean = true
     var windowLayout: LinearLayout? = null
@@ -405,6 +444,7 @@
     var notificationID: Int = 0
     private var paint = Paint()
     private var bgcolor: Int = 0
+    private var menuBar: DWMenu? = null
 
     // Our version of runOnUiThread that waits for execution
     fun waitOnUiThread(runnable: Runnable)
@@ -459,6 +499,57 @@
         }
     }
 
+    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+        if(menuBar == null) {
+            menuBar = DWMenu()
+            menuBar!!.menu = menu
+        }
+        return super.onCreateOptionsMenu(menu)
+    }
+
+    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
+        if(menuBar != null) {
+            menuBar!!.createMenu(menu)
+        } else {
+            menuBar = DWMenu()
+            menuBar!!.createMenu(menu)
+        }
+        return super.onPrepareOptionsMenu(menu)
+    }
+
+    fun menuBarNew(location: View): DWMenu?
+    {
+        // TODO: Make sure location is this activity
+        return menuBar
+    }
+
+    fun menuNew(cid: Int): DWMenu
+    {
+        val menu = DWMenu()
+        menu.id = cid
+        return menu
+    }
+
+    fun menuAppendItem(menu: DWMenu, title: String, cid: Int, flags: Int, end: Int, check: Int, submenu: DWMenu?): DWMenuItem
+    {
+        val menuitem = DWMenuItem()
+        menuitem.id = cid
+        menuitem.title = title
+        menuitem.check = check != 0
+        if(submenu != null) {
+            menuitem.submenu = submenu
+        }
+        if((flags and (1 shl 2)) != 0) {
+            menuitem.checked = true
+        }
+        if(end == 0) {
+            menu.children.add(0, menuitem)
+        } else {
+            menu.children.add(menuitem)
+        }
+        return menuitem
+    }
+
     /*
      * These are the Android calls to actually create the UI...
      * forwarded from the C Dynamic Windows API
@@ -2278,6 +2369,14 @@
         return Build.VERSION.SDK_INT
     }
 
+    fun dwMain()
+    {
+        runOnUiThread {
+            // Trigger the options menu to update when dw_main() is called
+            invalidateOptionsMenu()
+        }
+    }
+
     fun androidGetRelease(): String
     {
         return Build.VERSION.RELEASE