From e0850c2493cc64537569404538f2e50d4fac10b0 Mon Sep 17 00:00:00 2001 From: "kyle.yuan%sun.com" Date: Mon, 13 Jan 2003 06:26:11 +0000 Subject: [PATCH] Bug 187208 give more information for menu r=kyle.yuan, sr=bryner git-svn-id: svn://10.0.0.236/trunk@136226 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/accessible/public/nsIAccessible.idl | 1 + .../src/base/nsGenericAccessible.cpp | 6 ++ .../src/xul/nsXULMenuAccessible.cpp | 17 ++++ .../accessible/src/xul/nsXULMenuAccessible.h | 1 + .../src/gtk2/mai/nsMaiInterfaceAction.cpp | 93 ++++++++++++++++++- .../src/gtk2/mai/nsMaiInterfaceAction.h | 1 + 6 files changed, 117 insertions(+), 2 deletions(-) diff --git a/mozilla/accessible/public/nsIAccessible.idl b/mozilla/accessible/public/nsIAccessible.idl index 13f6b6c4327..a0ae1f5444e 100644 --- a/mozilla/accessible/public/nsIAccessible.idl +++ b/mozilla/accessible/public/nsIAccessible.idl @@ -44,6 +44,7 @@ interface nsIAccessible : nsISupports readonly attribute AString accDescription; readonly attribute AString accKeyboardShortcut; + readonly attribute AString accKeybinding; readonly attribute unsigned long accRole; readonly attribute unsigned long accState; diff --git a/mozilla/accessible/src/base/nsGenericAccessible.cpp b/mozilla/accessible/src/base/nsGenericAccessible.cpp index 6a0755767c5..33592e3a42c 100644 --- a/mozilla/accessible/src/base/nsGenericAccessible.cpp +++ b/mozilla/accessible/src/base/nsGenericAccessible.cpp @@ -128,6 +128,12 @@ NS_IMETHODIMP nsGenericAccessible::GetAccKeyboardShortcut(nsAString& _retval) return NS_ERROR_NOT_IMPLEMENTED; } +/* DOMString getKeybinding (); */ +NS_IMETHODIMP nsGenericAccessible::GetAccKeybinding(nsAString& _retval) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + /* unsigned long getAccRole (); */ NS_IMETHODIMP nsGenericAccessible::GetAccRole(PRUint32 *_retval) { diff --git a/mozilla/accessible/src/xul/nsXULMenuAccessible.cpp b/mozilla/accessible/src/xul/nsXULMenuAccessible.cpp index 9ca8f92cd3e..38d722479e5 100644 --- a/mozilla/accessible/src/xul/nsXULMenuAccessible.cpp +++ b/mozilla/accessible/src/xul/nsXULMenuAccessible.cpp @@ -114,6 +114,7 @@ NS_IMETHODIMP nsXULMenuitemAccessible::GetAccName(nsAString& _retval) return NS_OK; } +//return menu accesskey: N or Alt+F NS_IMETHODIMP nsXULMenuitemAccessible::GetAccKeyboardShortcut(nsAString& _retval) { static PRInt32 gMenuAccesskeyModifier = -1; // magic value of -1 indicates unitialized state @@ -157,6 +158,22 @@ NS_IMETHODIMP nsXULMenuitemAccessible::GetAccKeyboardShortcut(nsAString& _retval return NS_ERROR_FAILURE; } +//return menu shortcut: Ctrl+F or Ctrl+Shift+L +NS_IMETHODIMP nsXULMenuitemAccessible::GetAccKeybinding(nsAString& _retval) +{ + nsCOMPtr elt(do_QueryInterface(mDOMNode)); + if (elt) { + nsAutoString accelText; + elt->GetAttribute(NS_LITERAL_STRING("acceltext"), accelText); + if (accelText.IsEmpty()) + return NS_OK; + + _retval = accelText; + return NS_OK; + } + return NS_ERROR_FAILURE; +} + NS_IMETHODIMP nsXULMenuitemAccessible::GetAccRole(PRUint32 *_retval) { *_retval = ROLE_MENUITEM; diff --git a/mozilla/accessible/src/xul/nsXULMenuAccessible.h b/mozilla/accessible/src/xul/nsXULMenuAccessible.h index c4b4ed5dd43..717d91afdec 100644 --- a/mozilla/accessible/src/xul/nsXULMenuAccessible.h +++ b/mozilla/accessible/src/xul/nsXULMenuAccessible.h @@ -51,6 +51,7 @@ public: nsXULMenuitemAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell); NS_IMETHOD GetAccName(nsAString& _retval); NS_IMETHOD GetAccKeyboardShortcut(nsAString& _retval); + NS_IMETHOD GetAccKeybinding(nsAString& _retval); NS_IMETHOD GetAccState(PRUint32 *_retval); NS_IMETHOD GetAccRole(PRUint32 *_retval); NS_IMETHOD GetAccFirstChild(nsIAccessible **aAccFirstChild); diff --git a/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.cpp b/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.cpp index 109d5e6713f..d249ef00887 100644 --- a/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.cpp +++ b/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.cpp @@ -133,12 +133,101 @@ MaiInterfaceAction::GetName(gint aActionIndex) const gchar * MaiInterfaceAction::GetKeybinding(gint aActionIndex) { + //return all Keybindings including accesskey and shortcut + nsIAccessible *accessible = GetNSAccessible(); g_return_val_if_fail(accessible != NULL, NULL); - /* this is not supported in nsIAccessible yet */ + if (!mKeyBinding.IsEmpty()) + return mKeyBinding.get(); - return NULL; + nsAutoString allKeybinding; + + //get accesskey + nsAutoString accessKey; + nsresult rv = accessible->GetAccKeyboardShortcut(accessKey); + + if (NS_SUCCEEDED(rv) && !accessKey.IsEmpty()) { + nsCOMPtr parentAccessible; + accessible->GetAccParent(getter_AddRefs(parentAccessible)); + if (parentAccessible) { + PRUint32 role; + parentAccessible->GetAccRole(&role); + + if (role == ATK_ROLE_MENU_BAR) { + //it is topmenu, change from "Alt+f" to "f;f" + nsAutoString rightChar; + accessKey.Right(rightChar, 1); + allKeybinding = rightChar + NS_LITERAL_STRING(";") + + rightChar; + } + else if ((role == ATK_ROLE_MENU) || (role == ATK_ROLE_MENU_ITEM)) { + //it is submenu, change from "s" to "s;fs" + nsAutoString allKey = accessKey; + nsCOMPtr grandParentAcc = parentAccessible; + + while ((grandParentAcc) && (role != ATK_ROLE_MENU_BAR)) { + nsAutoString grandParentKey; + grandParentAcc->GetAccKeyboardShortcut(grandParentKey); + + if (!grandParentKey.IsEmpty()) { + nsAutoString rightChar; + grandParentKey.Right(rightChar, 1); + allKey = rightChar + allKey; + } + + nsCOMPtr tempAcc = grandParentAcc; + tempAcc->GetAccParent(getter_AddRefs(grandParentAcc)); + if (grandParentAcc) + grandParentAcc->GetAccRole(&role); + } + allKeybinding = accessKey + NS_LITERAL_STRING(";") + + allKey; + } + } + else { + //default process, rarely happens. + nsAutoString rightChar; + accessKey.Right(rightChar, 1); + allKeybinding = rightChar + NS_LITERAL_STRING(";") + rightChar; + } + } + else //don't have accesskey + allKeybinding = NS_LITERAL_STRING(";"); + + //get shortcut + nsAutoString keyBinding, subShortcut; + rv = accessible->GetAccKeybinding(keyBinding); + + if (NS_SUCCEEDED(rv) && !keyBinding.IsEmpty()) { + //change the shortcut from "Ctrl+Shift+L" to "L" + PRInt32 oldPos, curPos=0; + while ((curPos != -1) && (curPos < (PRInt32)keyBinding.Length())) { + oldPos = curPos; + nsAutoString subString; + curPos = keyBinding.FindChar('+', oldPos); + if (curPos == -1) { + keyBinding.Mid(subString, oldPos, keyBinding.Length() - oldPos); + subShortcut += subString; + } + else { + keyBinding.Mid(subString, oldPos, curPos - oldPos); + + //change "Ctrl" to "Control" + if (subString.EqualsIgnoreCase("ctrl")) + subString = NS_LITERAL_STRING("Control"); + + subShortcut += NS_LITERAL_STRING("<") + subString + + NS_LITERAL_STRING(">"); + curPos++; + } + } + } + + allKeybinding += NS_LITERAL_STRING(";") + subShortcut; + mKeyBinding = NS_ConvertUCS2toUTF8(allKeybinding); + + return mKeyBinding.get(); } gboolean diff --git a/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.h b/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.h index a01828c673d..fa26fc5cf9f 100644 --- a/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.h +++ b/mozilla/widget/src/gtk2/mai/nsMaiInterfaceAction.h @@ -64,6 +64,7 @@ public: private: nsCString mName; + nsCString mKeyBinding; }; #endif /* __MAI_INTERFACE_ACTION_H__ */