0354ad1ad152c70266f6401d62ed4f98e75f72c5
2 * Copyright (C) 2010 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com
.actionbarsherlock
.internal
.view
.menu
;
19 import java
.util
.ArrayList
;
20 import java
.util
.List
;
22 import android
.content
.ComponentName
;
23 import android
.content
.Context
;
24 import android
.content
.Intent
;
25 import android
.content
.pm
.PackageManager
;
26 import android
.content
.pm
.ResolveInfo
;
27 import android
.view
.KeyEvent
;
29 import com
.actionbarsherlock
.view
.Menu
;
30 import com
.actionbarsherlock
.view
.MenuItem
;
31 import com
.actionbarsherlock
.view
.SubMenu
;
36 public class ActionMenu
implements Menu
{
37 private Context mContext
;
39 private boolean mIsQwerty
;
41 private ArrayList
<ActionMenuItem
> mItems
;
43 public ActionMenu(Context context
) {
45 mItems
= new ArrayList
<ActionMenuItem
>();
48 public Context
getContext() {
52 public MenuItem
add(CharSequence title
) {
53 return add(0, 0, 0, title
);
56 public MenuItem
add(int titleRes
) {
57 return add(0, 0, 0, titleRes
);
60 public MenuItem
add(int groupId
, int itemId
, int order
, int titleRes
) {
61 return add(groupId
, itemId
, order
, mContext
.getResources().getString(titleRes
));
64 public MenuItem
add(int groupId
, int itemId
, int order
, CharSequence title
) {
65 ActionMenuItem item
= new ActionMenuItem(getContext(),
66 groupId
, itemId
, 0, order
, title
);
67 mItems
.add(order
, item
);
71 public int addIntentOptions(int groupId
, int itemId
, int order
,
72 ComponentName caller
, Intent
[] specifics
, Intent intent
, int flags
,
73 MenuItem
[] outSpecificItems
) {
74 PackageManager pm
= mContext
.getPackageManager();
75 final List
<ResolveInfo
> lri
=
76 pm
.queryIntentActivityOptions(caller
, specifics
, intent
, 0);
77 final int N
= lri
!= null ? lri
.size() : 0;
79 if ((flags
& FLAG_APPEND_TO_GROUP
) == 0) {
83 for (int i
=0; i
<N
; i
++) {
84 final ResolveInfo ri
= lri
.get(i
);
85 Intent rintent
= new Intent(
86 ri
.specificIndex
< 0 ? intent
: specifics
[ri
.specificIndex
]);
87 rintent
.setComponent(new ComponentName(
88 ri
.activityInfo
.applicationInfo
.packageName
,
89 ri
.activityInfo
.name
));
90 final MenuItem item
= add(groupId
, itemId
, order
, ri
.loadLabel(pm
))
91 .setIcon(ri
.loadIcon(pm
))
93 if (outSpecificItems
!= null
&& ri
.specificIndex
>= 0) {
94 outSpecificItems
[ri
.specificIndex
] = item
;
101 public SubMenu
addSubMenu(CharSequence title
) {
102 // TODO Implement submenus
106 public SubMenu
addSubMenu(int titleRes
) {
107 // TODO Implement submenus
111 public SubMenu
addSubMenu(int groupId
, int itemId
, int order
,
112 CharSequence title
) {
113 // TODO Implement submenus
117 public SubMenu
addSubMenu(int groupId
, int itemId
, int order
, int titleRes
) {
118 // TODO Implement submenus
122 public void clear() {
126 public void close() {
129 private int findItemIndex(int id
) {
130 final ArrayList
<ActionMenuItem
> items
= mItems
;
131 final int itemCount
= items
.size();
132 for (int i
= 0; i
< itemCount
; i
++) {
133 if (items
.get(i
).getItemId() == id
) {
141 public MenuItem
findItem(int id
) {
142 return mItems
.get(findItemIndex(id
));
145 public MenuItem
getItem(int index
) {
146 return mItems
.get(index
);
149 public boolean hasVisibleItems() {
150 final ArrayList
<ActionMenuItem
> items
= mItems
;
151 final int itemCount
= items
.size();
153 for (int i
= 0; i
< itemCount
; i
++) {
154 if (items
.get(i
).isVisible()) {
162 private ActionMenuItem
findItemWithShortcut(int keyCode
, KeyEvent event
) {
163 // TODO Make this smarter.
164 final boolean qwerty
= mIsQwerty
;
165 final ArrayList
<ActionMenuItem
> items
= mItems
;
166 final int itemCount
= items
.size();
168 for (int i
= 0; i
< itemCount
; i
++) {
169 ActionMenuItem item
= items
.get(i
);
170 final char shortcut
= qwerty ? item
.getAlphabeticShortcut() :
171 item
.getNumericShortcut();
172 if (keyCode
== shortcut
) {
179 public boolean isShortcutKey(int keyCode
, KeyEvent event
) {
180 return findItemWithShortcut(keyCode
, event
) != null
;
183 public boolean performIdentifierAction(int id
, int flags
) {
184 final int index
= findItemIndex(id
);
189 return mItems
.get(index
).invoke();
192 public boolean performShortcut(int keyCode
, KeyEvent event
, int flags
) {
193 ActionMenuItem item
= findItemWithShortcut(keyCode
, event
);
198 return item
.invoke();
201 public void removeGroup(int groupId
) {
202 final ArrayList
<ActionMenuItem
> items
= mItems
;
203 int itemCount
= items
.size();
205 while (i
< itemCount
) {
206 if (items
.get(i
).getGroupId() == groupId
) {
215 public void removeItem(int id
) {
216 mItems
.remove(findItemIndex(id
));
219 public void setGroupCheckable(int group
, boolean checkable
,
221 final ArrayList
<ActionMenuItem
> items
= mItems
;
222 final int itemCount
= items
.size();
224 for (int i
= 0; i
< itemCount
; i
++) {
225 ActionMenuItem item
= items
.get(i
);
226 if (item
.getGroupId() == group
) {
227 item
.setCheckable(checkable
);
228 item
.setExclusiveCheckable(exclusive
);
233 public void setGroupEnabled(int group
, boolean enabled
) {
234 final ArrayList
<ActionMenuItem
> items
= mItems
;
235 final int itemCount
= items
.size();
237 for (int i
= 0; i
< itemCount
; i
++) {
238 ActionMenuItem item
= items
.get(i
);
239 if (item
.getGroupId() == group
) {
240 item
.setEnabled(enabled
);
245 public void setGroupVisible(int group
, boolean visible
) {
246 final ArrayList
<ActionMenuItem
> items
= mItems
;
247 final int itemCount
= items
.size();
249 for (int i
= 0; i
< itemCount
; i
++) {
250 ActionMenuItem item
= items
.get(i
);
251 if (item
.getGroupId() == group
) {
252 item
.setVisible(visible
);
257 public void setQwertyMode(boolean isQwerty
) {
258 mIsQwerty
= isQwerty
;
262 return mItems
.size();