]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve radio button appearance in Android menus
authorPo Lu <luangruo@yahoo.com>
Fri, 17 Mar 2023 05:10:23 +0000 (13:10 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 17 Mar 2023 05:10:23 +0000 (13:10 +0800)
* java/org/gnu/emacs/EmacsContextMenu.java (EmacsContextMenu):
New field `lastGroupId'.
(Item): New field `isRadio'.
(addItem): New arg `isRadio'.
(inflateMenuItems): Apply an empty radio button group if
required.
* src/androidmenu.c (android_init_emacs_context_menu): Adjust
accordingly.
(android_menu_show): Likewise.

java/org/gnu/emacs/EmacsContextMenu.java
src/androidmenu.c

index d780641ba7024483d724991e9f2e0ad411476d6a..5bae41bd61d526c44f15910498051c3a5bf7da38 100644 (file)
@@ -55,6 +55,9 @@ public final class EmacsContextMenu
   /* The serial ID of the last context menu to be displayed.  */
   public static int lastMenuEventSerial;
 
+  /* The last group ID used for a menu item.  */
+  public int lastGroupId;
+
   private static class Item implements MenuItem.OnMenuItemClickListener
   {
     public int itemID;
@@ -62,6 +65,7 @@ public final class EmacsContextMenu
     public EmacsContextMenu subMenu;
     public boolean isEnabled, isCheckable, isChecked;
     public EmacsView inflatedView;
+    public boolean isRadio;
 
     @Override
     public boolean
@@ -153,12 +157,14 @@ public final class EmacsContextMenu
      checkable.  Likewise, if ISCHECKED is set, make the item
      checked.
 
-     If TOOLTIP is non-NULL, set the menu item tooltip to TOOLTIP.  */
+     If TOOLTIP is non-NULL, set the menu item tooltip to TOOLTIP.
+
+     If ISRADIO, then display the check mark as a radio button.  */
 
   public void
   addItem (int itemID, String itemName, boolean isEnabled,
           boolean isCheckable, boolean isChecked,
-          String tooltip)
+          String tooltip, boolean isRadio)
   {
     Item item;
 
@@ -169,6 +175,7 @@ public final class EmacsContextMenu
     item.isCheckable = isCheckable;
     item.isChecked = isChecked;
     item.tooltip = tooltip;
+    item.isRadio = isRadio;
 
     menuItems.add (item);
   }
@@ -244,7 +251,11 @@ public final class EmacsContextMenu
          }
        else
          {
-           menuItem = menu.add (item.itemName);
+           if (item.isRadio)
+             menuItem = menu.add (++lastGroupId, Menu.NONE, Menu.NONE,
+                                  item.itemName);
+           else
+             menuItem = menu.add (item.itemName);
            menuItem.setOnMenuItemClickListener (item);
 
            /* If the item ID is zero, then disable the item.  */
@@ -260,6 +271,12 @@ public final class EmacsContextMenu
            if (item.isChecked)
              menuItem.setChecked (true);
 
+           /* Define an exclusively checkable group if the item is a
+              radio button.  */
+
+           if (item.isRadio)
+             menu.setGroupCheckable (lastGroupId, true, true);
+
            /* If the tooltip text is set and the system is new enough
               to support menu item tooltips, set it on the item.  */
 
index 7d9c33e28b14d46d755f5937b7800505084cf992..f74e7ca6d99a178ebc1dd3fba00d26933f6c9346 100644 (file)
@@ -105,7 +105,7 @@ android_init_emacs_context_menu (void)
                      "Lorg/gnu/emacs/EmacsContextMenu;");
 
   FIND_METHOD (add_item, "addItem", "(ILjava/lang/String;ZZZ"
-              "Ljava/lang/String;)V");
+              "Ljava/lang/String;Z)V");
   FIND_METHOD (add_submenu, "addSubmenu", "(Ljava/lang/String;"
               "Ljava/lang/String;Ljava/lang/String;)"
               "Lorg/gnu/emacs/EmacsContextMenu;");
@@ -442,7 +442,9 @@ android_menu_show (struct frame *f, int x, int y, int menuflags,
                                                   (jboolean) !NILP (enable),
                                                   (jboolean) checkmark,
                                                   (jboolean) !NILP (selected),
-                                                  help_string);
+                                                  help_string,
+                                                  (jboolean) (EQ (type,
+                                                                  QCradio)));
              android_exception_check ();
 
              if (title_string)