changeset 2544:dbfcc0e357d6

Android: Clean up the menus... add separator, remove tildes and implement callbacks.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 13 May 2021 20:46:07 +0000
parents f9367eb9a6e7
children f803f3b164cf
files android/DWindows.kt android/dw.cpp
diffstat 2 files changed, 50 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/android/DWindows.kt	Thu May 13 19:54:15 2021 +0000
+++ b/android/DWindows.kt	Thu May 13 20:46:07 2021 +0000
@@ -40,6 +40,7 @@
 import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationManagerCompat
 import androidx.core.content.res.ResourcesCompat
+import androidx.core.view.MenuCompat
 import androidx.recyclerview.widget.RecyclerView
 import androidx.viewpager2.widget.ViewPager2
 import com.google.android.material.tabs.TabLayout
@@ -419,21 +420,34 @@
             menu = newmenu
         }
         if(menu != null) {
+            var group: Int = 0
+
+            // Enable group dividers for separators
+            MenuCompat.setGroupDividerEnabled(menu, true);
+
             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.submenuitem = menu?.addSubMenu(group, 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)
+                    if(menuitem.title!!.isEmpty()) {
+                        group += 1
+                    } else if(menuitem.menuitem == null) {
+                        menuitem.menuitem = menu?.add(group, menuitem.id, 0, menuitem.title)
+                        menuitem.menuitem!!.setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener { item: MenuItem? ->
+                            eventHandlerSimple(menuitem, 8)
+                            true
+                        })
                     }
                 }
             }
         }
     }
+
+    external fun eventHandlerSimple(item: DWMenuItem, message: Int)
 }
 
 class DWindows : AppCompatActivity() {
--- a/android/dw.cpp	Thu May 13 19:54:15 2021 +0000
+++ b/android/dw.cpp	Thu May 13 20:46:07 2021 +0000
@@ -492,6 +492,15 @@
     return timerfunc((void *)data);
 }
 
+/* A more simple method for quicker calls */
+JNIEXPORT void JNICALL
+Java_org_dbsoft_dwindows_DWMenu_eventHandlerSimple(JNIEnv* env, jobject obj, jobject obj1, jint message) {
+    void *params[8] = { nullptr };
+
+    _dw_event_handler(obj1, params, message);
+}
+
+
 /* This function adds a signal handler callback into the linked list.
  */
 void _dw_new_signal(ULONG message, HWND window, int msgid, void *signalfunction, void *discfunc, void *data)
@@ -3984,6 +3993,27 @@
 {
 }
 
+char _dw_removetilde(char *dest, const char *src)
+{
+    int z, cur=0;
+    char accel = '\0';
+
+    for(z=0;z<strlen(src);z++)
+    {
+        if(src[z] != '~')
+        {
+            dest[cur] = src[z];
+            cur++;
+        }
+        else
+        {
+            accel = src[z+1];
+        }
+    }
+    dest[cur] = 0;
+    return accel;
+}
+
 /*
  * Adds a menuitem or submenu to an existing menu.
  * Parameters:
@@ -4003,8 +4033,10 @@
 
     if((env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
+        char *newtitle = (char *)alloca(strlen(title)+1);
+        char accel = _dw_removetilde(newtitle, title);
         // Create a string
-        jstring jstr = env->NewStringUTF(title);
+        jstring jstr = env->NewStringUTF(newtitle);
         // First get the class that contains the method you need to call
         jclass clazz = _dw_find_class(env, DW_CLASS_NAME);
         // Get the method that you want to call